STM32-IO引脚复用-原理和使用
1.什么是端口復(fù)用?
STM32有很多的內(nèi)置外設(shè)(把一些功能ADC\看門狗…集中到芯片里面),這些外設(shè)的外部引腳都是與GPIO復(fù)用的。也就是說,一個(gè)GPIO如果可以復(fù)用為內(nèi)置外設(shè)的功能引腳,那么當(dāng)這個(gè)GPIO作為內(nèi)置外設(shè)使用的時(shí)候,就叫做復(fù)用。
例如串口1 的發(fā)送接收引腳是PA9,PA10,當(dāng)我們把PA9,PA10不用作GPIO,而用做復(fù)用功能串口1的發(fā)送接收引腳的時(shí)候,叫端口復(fù)用。
2.STM32引腳可以復(fù)用為哪些功能?
可在芯片STM32767IGT6資料中的pin and ball definitions中找到:
STM32(M4內(nèi)核以上)的端口復(fù)用映射原理
STM32系列微控制器IO引腳通過一個(gè)復(fù)用器連接到內(nèi)置外設(shè)或模塊。該復(fù)用器一次只允許一個(gè)外設(shè)的復(fù)用功能(AF)連接到對應(yīng)的IO口。這樣可以確保共用同一個(gè)IO引腳的外設(shè)之間不會發(fā)生沖突。
每個(gè)IO引腳都有一個(gè)復(fù)用器,該復(fù)用器采用16路復(fù)用功能輸入(AF0到AF15),可通過GPIOx_AFRL(針對引腳0-7)和GPIOx_AFRH(針對引腳8-15)寄存器對這些輸入進(jìn)行配置,每四位控制一路復(fù)用。
對于每一組GPIO都有GPIO 復(fù)用功能低位寄存器 (GPIOx_AFRL) (x = A…K):比如GPIOA有16個(gè)IO口,GPIOx_AFRL是32位,可以配置引腳0-7。
GPIOx_AFRL寄存器:
GPIO 復(fù)用功能高位寄存器 (GPIOx_AFRH) (x = A…J):
比如配置PA9連接到AF7,那么就是配置GPIOA_AFRH的AFR9,配置成0111 。
3.復(fù)用功能配置:
1.系統(tǒng)功能:將I/O連接到AF0,然后根據(jù)所用功能進(jìn)行配置:
- JTAG/SWD:在各器件復(fù)位之后,會將這些引腳指定為專用引腳,可供片上調(diào)試模塊立即使用 (不受GPIO控制器控制)
- RTC_REFIN:此引腳應(yīng)配置為輸入浮空模式。
- MCO1和MCO2:這些引腳必須配置為復(fù)用功能模式。
2.GPIO:在GPIOx_MODER寄存器中將所需I/O配置為輸出或輸入。
3.外設(shè)復(fù)用功能:
對于ADC和DAC,在GPIOx_MODER寄存器中將所需I/O配置為模擬通道。對于其它外設(shè):
- 在GPIOx_MODER寄存器中將所需I/O配置為復(fù)用功能
- 通過GPIOx_OTYPER、GPIOx_PUPDR和GPIOx_OSPEEDER寄存器,分別選擇類型、上拉/下拉以及輸出速度。
- 在GPIOx_AFRL或GPIOx_AFRH寄存器中,將I/O連接到所需AFx
4.端口復(fù)用功能配置過程
以PA9、PA10配置為串口1為例:
1.GPIO端口時(shí)鐘使能。
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIO時(shí)鐘
2.復(fù)用外設(shè)時(shí)鐘使能。
比如你要將端口PA9,PA10復(fù)用為串口,所以要使能串口時(shí)鐘。
__HAL_RCC_USART1_CLK_ENABLE(); //使能串口1時(shí)鐘
3.端口模式配置為復(fù)用功能。 HAL_GPIO_Init函數(shù)。
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //復(fù)用推挽輸出
4.配置GPIOx_AFRL或者GPIOx_AFRH寄存器,將IO連接到所需的AFx。HAL_GPIO_Init函數(shù)。
GPIO_Initure.Alternate=GPIO_AF7_USART1;//復(fù)用為USART1
在文件system-usart.c中可以找到:HAL_UART_MspInit
void HAL_UART_MspInit(UART_HandleTypeDef *huart) {//GPIO端口設(shè)置GPIO_InitTypeDef GPIO_Initure;if(huart->Instance==USART1)//如果是串口1,進(jìn)行串口1 MSP初始化{__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA時(shí)鐘__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1時(shí)鐘GPIO_Initure.Pin=GPIO_PIN_9; //PA9GPIO_Initure.Mode=GPIO_MODE_AF_PP; //復(fù)用推挽輸出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速GPIO_Initure.Alternate=GPIO_AF7_USART1; //復(fù)用為USART1HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9GPIO_Initure.Pin=GPIO_PIN_10; //PA10HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10#if EN_USART1_RXHAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中斷通道HAL_NVIC_SetPriority(USART1_IRQn,3,3); //搶占優(yōu)先級3,子優(yōu)先級3 #endif }}總結(jié)
以上是生活随笔為你收集整理的STM32-IO引脚复用-原理和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kdj指标主要看哪个值_KDJ绝密买卖法
- 下一篇: android studio 集成 第三