关于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的学习的主要内容,如果未能解决你的问题,请参考以下文章

STM32-关于Proteus 仿真无法运行STM32CubeMX自动生成的代码

STM32 引导加载程序

关于stm32的内部FLASH的使用

关于STM32 DMA相关总结[概述知识点]

关于 STM32 HAL 质量和性能 [关闭]

STM32学习及应用笔记一:SysTick定时器学习及应用