码迷,mamicode.com
首页 > 其他好文 > 详细

关于STM32的学习

时间:2018-12-12 14:52:10      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:它的   运行   结束   输入   void   star   osi   enter   and   

本文是对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("\r\n您发送的消息为:\r\n");
    for(t=0;t<len;t++)
        {
        USART1->DR=USART_RX_BUF[t];
        while((USART1->SR&0X40)==0);//判断USART1->SR的第六位,如果为1则发送第二个字节
        }
        printf("\r\n\r\n");//插入换行
        USART_RX_STA=0;
    }
        else
        {
        times++;
        if(times%5000==0)
        {
        printf("\r\n串口实验");
        printf("人脸识别\r\n");
        }
        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("\r\n串口实验");
        printf("人脸识别\r\n");
        }
        if (times%200==0)
        {
        printf("请输入数据,以回车键结束");
        }
        if(times%30==0)
        {
        LED0 =!LED0;
        }
        delay_ms(10);
        }

这些代码的作用是在没有输入的时候提示用户。

关于STM32的学习

标签:它的   运行   结束   输入   void   star   osi   enter   and   

原文地址:https://www.cnblogs.com/-wgm960705/p/10107924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!