STM32的串口

2019-07-21 00:40发布

如果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,说明串口调试助手接收到了数据,
但是数据就是没有在界面上显示出来,这是什么原因呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。