啦哈拉卅 发表于 2017-7-13 15:59:51

求大神解答: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?
郁闷一天了。


啦哈拉卅 发表于 2017-7-13 16:55:47


沉下心,仔细查看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。



菜鸟见解,大神看到多多指教!

MrJiu 发表于 2017-7-14 09:29:37

你的解释是对的,功能的映射有专门的寄存器!!!也就是你说的AF,其实可以看一看参考手册,里面介绍的比较详细!!!!

啦哈拉卅 发表于 2017-7-17 10:58:01

MrJiu 发表于 2017-7-14 09:29
你的解释是对的,功能的映射有专门的寄存器!!!也就是你说的AF,其实可以看一看参考手册,里面介绍的比较 ...

多谢指导

爱电子辉辉 发表于 2017-9-4 10:26:27

请问楼主,你的串口4配置好了。可以正常使用吗?我的程序,只要串口4一进入中断,程序就卡死了。请问这个是什么问题呢,本人菜鸟一枚,望指教。。

啦哈拉卅 发表于 2017-9-28 17:28:43

爱电子辉辉 发表于 2017-9-4 10:26
请问楼主,你的串口4配置好了。可以正常使用吗?我的程序,只要串口4一进入中断,程序就卡死了。请问这个是 ...

卡死是什么情况?
有没有清除中断标志位?
页: [1]
查看完整版本: 求大神解答:STM32L452RET6 UART4的配置问题