关于STM32的学习
Posted -wgm960705
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32的学习相关的知识,希望对你有一定的参考价值。
本文是对STM32F429串口通信程序的理解与体会。
int main(void) { u8 t; //循环变量 u8 len; //数据长度变量 u16 times=0; //计时变量 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz delay_init(180); //初始化延时函数 LED_Init(); //初始化 LED 时钟 uart_init(90,11500);//串口初始化为115200 while(1) { if(USART_RX_STA&0x8000)//数据接收完成 { len=USART_RX_STA&0x3fff; printf(" 您发送的消息为: "); for(t=0;t<len;t++) { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//判断USART1->SR的第六位,如果为1则发送第二个字节 } printf(" ");//插入换行 USART_RX_STA=0; } else { times++; if(times%5000==0) { printf(" 串口实验"); printf("人脸识别 "); } if (times%200==0) { printf("请输入数据,以回车键结束"); } if(times%30==0) { LED0 =!LED0; } delay_ms(10); } } }
void USART1_IRQHandler(void) { u8 res; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntEnter(); #endif if(USART1->SR&(1<<5))//接收到数据 { res=USART1->DR; //向变量写入接收到的值 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(res!=0x0a)USART_RX_STA=0;//回车由两个字节组组成,0x0D和0X0A,接收到0X0D后没有接收到0X0A即为接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 }else //还没收到0X0D { if(res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=res; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntExit(); #endif }
在这里起到重要作用的一个变量为USART_RX_STA,这是一个32位的数据,它的最高位用来表示接收的状态,最高位为1即代表接收完成。
if(res==0x0d)USART_RX_STA|=0x4000;
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//回车由两个字节组组成,0x0D和0X0A,接收到0X0D后没有接收到0X0A即为接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
用户向STM32发送数据时以回车作为结尾,回车由两个字节组成,0X0D和0X0A,当STM32接收到0X0D的时候就把USART_RX_STA的次高位置1,表示接收到了0X0D,然后判断是否接收到0X0A,如果没有就认为接收错误。USART_RX_STA除了次高位和最高位的剩下的其他位表示接收到的数据长度。和0X3FFF相与即可把最高位和次高位清零,避免对数据长度的判断。这样把一个变量分成几部分使用可以减少变量的定义,即为对程序的优化。
USART1_IRQHandler()函数可以在Start文件里找到,其用DCD定义,按照我的理解是映射到了串口中断入口处。每次串口中断都会转到此处运行,可以理解为单片机的中断处理程序。
else
{
times++;
if(times%5000==0)
{
printf("
串口实验");
printf("人脸识别
");
}
if (times%200==0)
{
printf("请输入数据,以回车键结束");
}
if(times%30==0)
{
LED0 =!LED0;
}
delay_ms(10);
}
这些代码的作用是在没有输入的时候提示用户。
以上是关于关于STM32的学习的主要内容,如果未能解决你的问题,请参考以下文章