stm32f051移植RT-Thread串口注意点

1. STM32_SRAM_SIZE  RAM的大小,051是8K

       #define STM32_SRAM_SIZE         8

2. 时钟配置,默认是8M,我的外接HSE晶振是24M,那需要修改倍频参数

     查看SetSysClock这个函数,

  RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL2); 

3.  HSE_VALUE  ,这个值要根据HSE晶振实际值来改,不改,串口时钟不对,无法使用,切记

    #define HSE_VALUE    ((uint32_t)24000000) 

4. 串口接收DMA这块,参考bsp下面103系列来修改,基本都一致,几个注意点如下:

    stm32_putc和stm32_getc里面的寄存器和103不一样,需要修改下

static int stm32_putc(struct rt_serial_device *serial, char c)
{
    struct stm32_uart* uart;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct stm32_uart *)serial->parent.user_data;

    if (serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX)
    {
        if (!(uart->uart_device->ISR & USART_FLAG_TXE))
        {
            USART_ITConfig(uart->uart_device, USART_IT_TC, ENABLE);
            return -1;
        }
        uart->uart_device->TDR = c;
        USART_ITConfig(uart->uart_device, USART_IT_TC, ENABLE);
    }
    else
    {
        uart->uart_device->TDR = c;
        while (!(uart->uart_device->ISR & USART_FLAG_TC));
    }

    return 1;
}
static int stm32_getc(struct rt_serial_device *serial)
{
    int ch;
    struct stm32_uart* uart;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct stm32_uart *)serial->parent.user_data;

    ch = -1;
    if (uart->uart_device->ISR & USART_FLAG_RXNE)
    {
        ch = uart->uart_device->RDR & 0xff;
    }

    return ch;
}

 最重要的一点,103里面好像没问题,但是移植到051里面就有问题,如下函数

static void uart_isr(struct rt_serial_device *serial)

这个函数里面有个空闲中断,DMA接收结束靠空闲中断来处理,需要clear一下,不然系统直接挂,修改如下: 

if(USART_GetITStatus(uart->uart_device, USART_IT_IDLE) != RESET)
    {
		USART_ClearITPendingBit(uart->uart_device, USART_IT_IDLE);
        dma_uart_rx_idle_isr(serial);
    }

这个函数里面应该清下IDLE标志,不然一直进中断,我看103里面没有清,但是软件没问题,不知道为什么?是不是在其他地方清了,再复查下

你可能感兴趣的:(rt-thread)