[其他ST产品] STM32的AFIO时钟什么时候需要开启

[复制链接]
9114|45
 楼主| 自动化陈稳 发表于 2023-5-27 13:24 | 显示全部楼层
6.2 串口通信程序精讲


  1. #include "stm32f4xx.h"
  2. #include "delay.h"
  3. #include "LED.h"
  4. #include "BEEP.h"
  5. #include "Key.h"
  6. #include "usart.h"

  7. int main(void)
  8. {
  9.         unsigned char t,len;//定义最大接收的字节数
  10.         unsigned int times=0;
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统的中断优先级分组2
  12.         delay_init(168);//初始化延迟函数
  13.         uart_init(115200);//串口初始化波特率设置为115200
  14.         LED_Init();//LED初始化
  15.         LED0=0;//默认程序输入时LED0点亮
  16.         while(1)
  17.         {
  18.                 if(USART_RX_STA&0x8000)//USART_RX_STA接收状态标记  USART_RX_STA&0x8000如果为真,则表示最高位为1,也就是bit15接收完成标志
  19.                         //bit15:接收完成标志   bit14:接收到0x0D标志  bit13-0:接收到的有效数据个数
  20.                 //程序要求,发送的字符是以回车换行结束(0x0D,0x0A)
  21.                 //0x0D是回车的ASCII码
  22.                 {
  23.                         len=USART_RX_STA&0x3FFF;
  24.                         //因为USART_RX_STA是16位,第16位和第15位是判断是否接收完成和停止的标志位,0-14位是数据位
  25.                         //USART_RX_STA&0x3FFF是USART_RX_STA&0011 1111 1111 1111把数据位全部拿出来
  26.                         printf("\r\n您发送的消息为:\r\n");//打印您发送的消息为:不断发送到串口
  27.                         for(t=0;t<len;t++)//串口通信是串行通信,需要一位一位的传
  28.                         {
  29.                                 USART1->DR=USART_RX_BUF[t];//接收缓冲,最大USART_REC_LEN个字节,末字节为换行符
  30.                                 //串口接收到的数据保存在USART_RX_BUF中,t是接收到的字节数
  31.                                 //将接收到的数据保存在DR数据寄存器中
  32.                                 while((USART1->SR&0x40)==0);//SR是状态寄存器,状态寄存器的最高位如果是0,表示数据传输完成,可以执行下一步
  33.                         }
  34.                         printf("\r\n\r\n");//打印换行
  35.                         USART_RX_STA=0;//状态标志位置0,表示本次传输完成,可以执行下一次的传输了
  36.                 }
  37.                 else//最高位不是1,数据还没有接收完成,继续接收,传至数据位
  38.                 {
  39.                         times++;//设置一个时间位,时间++,类似于定时器中断的T0Count;
  40.                         if(times%5000==0)//每过5s,打印一次下述程序
  41.                         {
  42.                                 printf("\r\nALIENTEK 探索者 STM32F407开发板 串口实验\r\n");
  43.                                 printf("正点原子@ALIENTEK\r\n\r\n\r\n");
  44.                         }
  45.                         if(times%200==0)//每过200ms,打印一次:请输入数据,以回车键结束
  46.                                 printf("请输入数据,以回车键结束\r\n");
  47.                         if(times%30==0)//每过30ms,LED0闪烁
  48.                                 LED0=!LED0;
  49.                         delay_ms(10);//延迟10ms
  50.                 }
  51.         }
  52. }
 楼主| 自动化陈稳 发表于 2023-5-27 13:24 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2023-5-27 13:25 | 显示全部楼层
7. MDK5:main.c(17): error: #268: declaration may not appear after executable statement in block
66046471942ec98c9.png
该错误是在运行上述程序的过程中出现的;

出现该错误的主要原因是:MDK5默认的编程方式是C89,是不支持C/C++的空格编程定义也就是上述在定义结构体变量时,使用了空格编程的定义),因此会报错。

 楼主| 自动化陈稳 发表于 2023-5-27 13:25 | 显示全部楼层
7. MDK5:main.c(17): error: #268: declaration may not appear after executable statement in block

该错误是在运行上述程序的过程中出现的;

出现该错误的主要原因是:MDK5默认的编程方式是C89,是不支持C/C++的空格编程定义也就是上述在定义结构体变量时,使用了空格编程的定义),因此会报错。

 楼主| 自动化陈稳 发表于 2023-5-27 13:25 | 显示全部楼层
解决方法:点击MDK5的魔术棒
32296471944d7cc84.png
 楼主| 自动化陈稳 发表于 2023-5-27 13:25 | 显示全部楼层
在C/C++中勾选  C99 Mode即可;

76282647194655f1ce.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部