您好,我正在使用stm32f103c8,并且尝试使用usart2,但是它不起作用。
当我使用具有USART2相同配置的USART1时,它与我配合良好。但是USART2将垃圾发送到PC终端,有人可以帮助我解决USART2中的问题吗?

这是USART2的配置:

int main(void){
    RCC_VidInit();                                    //INTIALIZE EXTERNAL CRYSTAL OSCILATOR = 8 MHZ
    RCC_VidEnablePeripheralClock( APB2_BUS , 2 );     //ENABLE CLOCK OF GPIOA

    CLR_BIT( GPIOA->CRL , 8  );    SET_BIT( GPIOA->CRL , 9  );    //SPEED OF PA2 = 2MHZ
    CLR_BIT( GPIOA->CRL , 10 );    SET_BIT( GPIOA->CRL , 11);     //PA2 OUTPUT PUSHPULL AF

    CLR_BIT( GPIOA->CRL , 12  );   CLR_BIT( GPIOA->CRL , 13  );   //PA3 INPUT
    SET_BIT( GPIOA->CRL , 14 );    CLR_BIT( GPIOA->CRL , 15);     //PA3 FLOATING INPUT

    RCC_VidEnablePeripheralClock( APB1_BUS , 17 );                //ENABLE CLOCK OF USART2
    SET_BIT( USART2->CR1 , 13 );   SET_BIT( USART2->CR1 , 3  );   //ENABLE UE & TE

    USART2 -> BRR = 0x341 ;     //BAUDRATE 9600 OF CRYSTLE 8MHZ BY Eq = (8000 000 / 16 * 9600)
    while(1){
        if( ( GET_BIT( USART2 -> SR , 6 ) ) == 1 ){ //CHECH ABOUT TC FLAG
            USART2 -> DR = '1' ; /*PUT DATA ON DATA REG*/    for(int i = 0 ; i <= 1000000 ; i++ ); /*JUST BASIC DELAY*/  }}
return 0; }


这是USART1配置,非常适合我

int main(void){
    RCC_VidInit();                                  //INTIALIZE EXTERNAL CRYSTAL OSCILATOR = 8 MHZ
    RCC_VidEnablePeripheralClock( APB2_BUS , 2 );   //ENABLE CLOCK OF GPIOA

    CLR_BIT( GPIOA->CRH , 4  );    SET_BIT( GPIOA->CRH , 5  );    //SPEED OF PA9 = 2MHZ
    CLR_BIT( GPIOA->CRH , 6 );     SET_BIT( GPIOA->CRH , 7  );    //PA9 OUTPUT PUSHPULL AF

    CLR_BIT( GPIOA->CRH , 8  );    CLR_BIT( GPIOA->CRH , 9  );    //PA10 INPUT
    SET_BIT( GPIOA->CRH , 10 );    CLR_BIT( GPIOA->CRH , 11 );    //PA10 FLOATING INPUT

    RCC_VidEnablePeripheralClock( APB2_BUS , 14 );                //ENABLE CLOCK OF USART1
    SET_BIT( USART1->CR1 , 13 );   SET_BIT( USART1->CR1 , 3  );   //ENABLE UE & TE

    USART1 -> BRR = 0x341 ; //BAUDRATE 9600 OF CRYSTLE 8MHZ BY Eq = (8000 000 / 16 * 9600)
    while(1){
        if( ( GET_BIT( USART1 -> SR , 6 ) ) == 1 ){ //CHECH ABOUT TC FLAG
            USART1 -> DR = '1' ; /*PUT DATA ON DATA REG*/    for(int i = 0 ; i <= 1000000 ; i++ ); /*JUST BASIC DELAY*/  }}
return 0; }

最佳答案

但是USART2将垃圾发送到PC


这通常意味着您的时钟/波特率设置错误。也许APB2总线默认情况下具有不同的时钟分配器。
使用HAL的原因之一是因为它应该捕获这些情况并计算正确的BRR值。

诊断的最简单方法是使用示波器查看UART2输出波形。但是我先尝试1200和4800波特(猜测1 MHz4 MHz基本时钟)。

注意:OP的“延迟”已被大多数ARM C编译器优化,并且不得在生产代码中使用。

关于c - 为什么USART2发送垃圾值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59107459/

10-11 19:44