您好,我正在使用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 MHz
和4 MHz
基本时钟)。
注意:OP的“延迟”已被大多数ARM C编译器优化,并且不得在生产代码中使用。
关于c - 为什么USART2发送垃圾值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59107459/