如果STM32先从串口调试助手上接收然后+1再发送发送到串口调试助手上,一些正常;如图:
其程序代码如下:
==========================================
uart.c
===========================
#include "sys.h"
#include "stm32f4xx.h"
/*
本示例的作用就是,
将调试助手上的数据发送到串口,
然后从串口中再将数据加1发送到调试助手上
*/
/*
关于串口的操作可参考寄存器版的步骤
*/
/*
串口初始化函数:
主要是关于寄存器的相关配置
*/
/*串口初始化*/
void USART_Init(void){
/*
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。
也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当
这个GPIO作为内置外设使用的时候,就叫做复用。
*/
/*1.使能GPIO端口时钟*/
RCC->AHB1ENR |= 1;
/*2.使能复用外设时钟*/
RCC->APB2ENR |= 1<<4;
/*3.端口模式配置为复用功能*/
GPIOA->MODER &= ~(0XF << 18);
GPIOA->MODER |= 0xa << 18;
/*4.配置GPIOx_AFRL或者GPIOx_AFRH寄存器,
将IO连接到所需的复用外设*/
GPIOA->AFR[1] &= ~(0XFF << 4);
GPIOA->AFR[1] |= (0x77 << 4);
/*************************
串口初始化: 接收端和发送端
*************************/
//设置OVER8
USART1->CR1 &= ~(1<<15);
/*设置波特率,关于波特率,可以参考PPT,总结一下*/
USART1->BRR = (0x2D<<4) + 0x09;
//使能接收器和发送器
USART1->CR1 |= 0X3 << 2;
//使能USART
USART1->CR1 |= 1<<13;
}
===========================
uart.h
=================
#ifndef _EXTI_H
#define _EXTI_H
void USART_Init(void);
#endif
=================
test.c
=================
#include "sys.h"
#include "delay.h"
#include "uart.h"
#include "led.h"
int main(void){
unsigned char res;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz //思考一下为啥要设置整个时钟(到时可参考时钟那章节);
delay_init(168); //初始化延时函数
USART_Init();
/*
接收串口调试助手中的数据,然后将
接收到的数据+1发送到串口调试助手上
*/
while(1){
if(((USART1->SR) & (0x20)) == 0x20){
res = USART1->DR;
res += 1;
USART1->DR = res;
while(((USART1->SR)&(0x80)) != 0x80);
delay_ms(1000);
}
}
}
=================
问题:
如果我把从串口调试助手上接收的代码去掉,仅需发送数据到串口调试助手上,其他代码不变,仅test.c的代码改为:
#include "sys.h"
#include "delay.h"
#include "uart.h"
#include "led.h"
int main(void){
unsigned char res;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //初始化延时函数
USART_Init();
/*
接收串口调试助手中的数据,然后将
接收到的数据+1发送到串口调试助手上
*/
while(1){
// if(((USART1->SR) & (0x20)) == 0x20){
// res = USART1->DR;
res = 1;
USART1->DR = res;
while(((USART1->SR)&(0x80)) != 0x80);
delay_ms(1000);
}
}
//}
那么测试的效果为:
从图片中,我们可以看到:R:11,说明串口调试助手接收到了数据,
但是数据就是没有在界面上显示出来,这是什么原因呢?
一周热门 更多>