求大神解答:STM32L452RET6 UART4的配置问题
使用STM32CubeMX进行硬件配置UART4时,如果配置PC10 & PC11位串口的收发,配置如下:void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */
/* USER CODE END UART4_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_UART4_CLK_ENABLE();
/**UART4 GPIO Configuration
PC10 ------> UART4_TX
PC11 ------> UART4_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USER CODE BEGIN UART4_MspInit 1 */
/* USER CODE END UART4_MspInit 1 */
}
}如果选择PA0 & PA1为串口收发IO,配置如下:void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */
/* USER CODE END UART4_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_UART4_CLK_ENABLE();
/**UART4 GPIO Configuration
PA0 ------> UART4_TX
PA1 ------> UART4_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN UART4_MspInit 1 */
/* USER CODE END UART4_MspInit 1 */
}
}
而根据官方STM32L452的datasheet,AF8对应的复用功能有UART4,同时对应的有PA0 & PA1和 PC10 & PC11。
那么问题是,单片机是如何用户设置的UART4引脚对应的是PA0 & PA1还是 PC10 & PC11?
郁闷一天了。
沉下心,仔细查看HAL库函数源码,HAL_GPIO_Init()函数中
/**
* @briefInitialize the GPIOx peripheral according to the specified parameters in the GPIO_Init.
* @paramGPIOx: where x can be (A..H) to select the GPIO peripheral for STM32L4 family
* @paramGPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
* the configuration information for the specified GPIO peripheral.
* @retval None
*/
void HAL_GPIO_Init(GPIO_TypeDef*GPIOx, GPIO_InitTypeDef *GPIO_Init)
{
uint32_t position = 0x00;
uint32_t iocurrent = 0x00;
uint32_t temp = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
/* Configure the port pins */
while (((GPIO_Init->Pin) >> position) != RESET)
{
/* Get current io position */
iocurrent = (GPIO_Init->Pin) & (1U << position);
if(iocurrent)
{
/*--------------------- GPIO Mode Config<span style="line-height: 1.5;">uration ------------------------*/</span>根据初始化不同port口,进行不同的初始化,对不同的寄存器赋值。
仿真结果如下:
AFRH 或AFRL寄存器的值都是AF8(0x8),bit位不同。
最后把PA 或者PC作为UART4复用功能IO。
菜鸟见解,大神看到多多指教!
你的解释是对的,功能的映射有专门的寄存器!!!也就是你说的AF,其实可以看一看参考手册,里面介绍的比较详细!!!! MrJiu 发表于 2017-7-14 09:29
你的解释是对的,功能的映射有专门的寄存器!!!也就是你说的AF,其实可以看一看参考手册,里面介绍的比较 ...
多谢指导 请问楼主,你的串口4配置好了。可以正常使用吗?我的程序,只要串口4一进入中断,程序就卡死了。请问这个是什么问题呢,本人菜鸟一枚,望指教。。 爱电子辉辉 发表于 2017-9-4 10:26
请问楼主,你的串口4配置好了。可以正常使用吗?我的程序,只要串口4一进入中断,程序就卡死了。请问这个是 ...
卡死是什么情况?
有没有清除中断标志位?
页:
[1]