发新帖我要提问
123
返回列表
打印
[其他ST产品]

STM32的AFIO时钟什么时候需要开启

[复制链接]
楼主: 自动化陈稳
手机看帖
扫描二维码
随时随地手机跟帖
41
自动化陈稳|  楼主 | 2023-5-27 13:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
6.2 串口通信程序精讲


#include "stm32f4xx.h"
#include "delay.h"
#include "LED.h"
#include "BEEP.h"
#include "Key.h"
#include "usart.h"

int main(void)
{
        unsigned char t,len;//定义最大接收的字节数
        unsigned int times=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统的中断优先级分组2
        delay_init(168);//初始化延迟函数
        uart_init(115200);//串口初始化波特率设置为115200
        LED_Init();//LED初始化
        LED0=0;//默认程序输入时LED0点亮
        while(1)
        {
                if(USART_RX_STA&0x8000)//USART_RX_STA接收状态标记  USART_RX_STA&0x8000如果为真,则表示最高位为1,也就是bit15接收完成标志
                        //bit15:接收完成标志   bit14:接收到0x0D标志  bit13-0:接收到的有效数据个数
                //程序要求,发送的字符是以回车换行结束(0x0D,0x0A)
                //0x0D是回车的ASCII码
                {
                        len=USART_RX_STA&0x3FFF;
                        //因为USART_RX_STA是16位,第16位和第15位是判断是否接收完成和停止的标志位,0-14位是数据位
                        //USART_RX_STA&0x3FFF是USART_RX_STA&0011 1111 1111 1111把数据位全部拿出来
                        printf("\r\n您发送的消息为:\r\n");//打印您发送的消息为:不断发送到串口
                        for(t=0;t<len;t++)//串口通信是串行通信,需要一位一位的传
                        {
                                USART1->DR=USART_RX_BUF[t];//接收缓冲,最大USART_REC_LEN个字节,末字节为换行符
                                //串口接收到的数据保存在USART_RX_BUF中,t是接收到的字节数
                                //将接收到的数据保存在DR数据寄存器中
                                while((USART1->SR&0x40)==0);//SR是状态寄存器,状态寄存器的最高位如果是0,表示数据传输完成,可以执行下一步
                        }
                        printf("\r\n\r\n");//打印换行
                        USART_RX_STA=0;//状态标志位置0,表示本次传输完成,可以执行下一次的传输了
                }
                else//最高位不是1,数据还没有接收完成,继续接收,传至数据位
                {
                        times++;//设置一个时间位,时间++,类似于定时器中断的T0Count;
                        if(times%5000==0)//每过5s,打印一次下述程序
                        {
                                printf("\r\nALIENTEK 探索者 STM32F407开发板 串口实验\r\n");
                                printf("正点原子@ALIENTEK\r\n\r\n\r\n");
                        }
                        if(times%200==0)//每过200ms,打印一次:请输入数据,以回车键结束
                                printf("请输入数据,以回车键结束\r\n");
                        if(times%30==0)//每过30ms,LED0闪烁
                                LED0=!LED0;
                        delay_ms(10);//延迟10ms
                }
        }
}

使用特权

评论回复
42
自动化陈稳|  楼主 | 2023-5-27 13:24 | 只看该作者

使用特权

评论回复
43
自动化陈稳|  楼主 | 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++的空格编程定义也就是上述在定义结构体变量时,使用了空格编程的定义),因此会报错。

使用特权

评论回复
44
自动化陈稳|  楼主 | 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++的空格编程定义也就是上述在定义结构体变量时,使用了空格编程的定义),因此会报错。

使用特权

评论回复
45
自动化陈稳|  楼主 | 2023-5-27 13:25 | 只看该作者
解决方法:点击MDK5的魔术棒

使用特权

评论回复
46
自动化陈稳|  楼主 | 2023-5-27 13:25 | 只看该作者
在C/C++中勾选  C99 Mode即可;


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则