这里先给出程序源码:
调用库函数:
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
int main()
{
u8 i;
u8 len;
u32 times = 0;
//中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化延时函数
delay_init(84);
//初始化串口
uart_init(115200);
//初始化led
LED_Init();
//循环
LED0 = 0;
while (1)
{
//检验接受标志
//若接收到
if (USART_RX_STA & 0x8000) //位15判定是否接收到数据
{
//确定接受信息的长度
len = USART_RX_STA & 0x3fff; //位0到位14与1位与
//输出提示信息
printf("rn您发送的消息为:rn");
//接受信息并串口输出
for (i = 0; i < len; i++) {
USART_SendData(USART1, USART_RX_BUF
); //使用库函数SendData向串口1发送数据
//直到接收结束为止
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //使用库函数检验发送是否接受完成
}
printf("rnrn");
//检验标志复位
USART_RX_STA = 0;
}
//没有接收到
else
{
times++;
if (times % 30 ==0) LED0 = !LED0;
if (times % 500 == 0) printf("rn请输入要输出的内容rn");
if (times % 3000 == 0) printf("rn年轻人啊!身残志坚。rn");
//延时
delay_ms(10);
}
}
}
使用寄存器:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "sys.h"
int main(void)
{
u8 i; //循环计数位
u8 len;
u32 times;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为2
uart_init(115200); //串口初始化波特率设置为115200
delay_init(84); //延时初始化
led_init();
//GPIO_ResetBits(GPIOF, GPIO_Pin_9); //点亮红灯
while (1){
if (USART_RX_STA & 0x8000) //USART_RX_STA位15(第16位)为接收完成标志,其作用在于判定是否接收完成
{
len = USART_RX_STA & 0x3fff; //得到此次收到的数据长度
printf("rn您发送的消息为:rn");
for (i = 0; i < len; i++) {
USART1->DR = USART_RX_BUF;
while ((USART1->SR & 0x40) == 0); //USART1->SR位6为发送完成位,具体寄存器相关配置参考文档《stm32f4xx中文参考手册》
}
printf("rnrn");
USART_RX_STA = 0;
} else
{
times++;
if (times % 5000 == 0) {
printf("rnALIENTEK 探索者STM32F407开发板 串口实验rn");
printf("正点原子@ALIENTEKrnrnrn");
}
if (times % 200 == 0) printf("请输入数据,以回车键结束rn");
if (times % 30 == 0) LED0 = !LED0;//led闪烁提示正在运行程序
delay_ms(10);
}
}
}
正确的输出结果应该是这样的(以库函数版本为例):
同时红色LED显示灯不停闪烁。
这里先给出程序源码:
调用库函数:
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
int main()
{
u8 i;
u8 len;
u32 times = 0;
//中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化延时函数
delay_init(84);
//初始化串口
uart_init(115200);
//初始化led
LED_Init();
//循环
LED0 = 0;
while (1)
{
//检验接受标志
//若接收到
if (USART_RX_STA & 0x8000) //位15判定是否接收到数据
{
//确定接受信息的长度
len = USART_RX_STA & 0x3fff; //位0到位14与1位与
//输出提示信息
printf("rn您发送的消息为:rn");
//接受信息并串口输出
for (i = 0; i < len; i++) {
USART_SendData(USART1, USART_RX_BUF
); //使用库函数SendData向串口1发送数据
//直到接收结束为止
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //使用库函数检验发送是否接受完成
}
printf("rnrn");
//检验标志复位
USART_RX_STA = 0;
}
//没有接收到
else
{
times++;
if (times % 30 ==0) LED0 = !LED0;
if (times % 500 == 0) printf("rn请输入要输出的内容rn");
if (times % 3000 == 0) printf("rn年轻人啊!身残志坚。rn");
//延时
delay_ms(10);
}
}
}
使用寄存器:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "sys.h"
int main(void)
{
u8 i; //循环计数位
u8 len;
u32 times;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为2
uart_init(115200); //串口初始化波特率设置为115200
delay_init(84); //延时初始化
led_init();
//GPIO_ResetBits(GPIOF, GPIO_Pin_9); //点亮红灯
while (1){
if (USART_RX_STA & 0x8000) //USART_RX_STA位15(第16位)为接收完成标志,其作用在于判定是否接收完成
{
len = USART_RX_STA & 0x3fff; //得到此次收到的数据长度
printf("rn您发送的消息为:rn");
for (i = 0; i < len; i++) {
USART1->DR = USART_RX_BUF;
while ((USART1->SR & 0x40) == 0); //USART1->SR位6为发送完成位,具体寄存器相关配置参考文档《stm32f4xx中文参考手册》
}
printf("rnrn");
USART_RX_STA = 0;
} else
{
times++;
if (times % 5000 == 0) {
printf("rnALIENTEK 探索者STM32F407开发板 串口实验rn");
printf("正点原子@ALIENTEKrnrnrn");
}
if (times % 200 == 0) printf("请输入数据,以回车键结束rn");
if (times % 30 == 0) LED0 = !LED0;//led闪烁提示正在运行程序
delay_ms(10);
}
}
}
正确的输出结果应该是这样的(以库函数版本为例):
同时红色LED显示灯不停闪烁。
举报