>_<!功能:PC端发送一个特定的字符:0x0d 0x0a,单片机则返回一句话,如图:

>_<!知识:

1、复用功能I/O和调试配置(AFIO) 

为了优化外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)(参见0节)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。

2、嵌套向量中断控制器(NVIC)

  • l 43 个可屏蔽中断通道(不包含16 个Cortex-M3 的中断线); 
  • l 16 个可编程的优先等级; 
  • l 低延迟的异常和中断处理; 
  • l 电源管理控制; 
  • l 系统控制寄存器的实现; 
  • l 嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断。 

 PS:

  a、SysTick:系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9兆赫,产生1ms时基。

   b、中断和异常向量 :【中断向量表】

3、USART通用同步异步收发器(USART)

  •  它支持同步单向通信和半双工单线通信
  •  任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 

   a、RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。 

   b、TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O 端口配置。当发送器被激活,并且没东西发送时,TX 引脚处于高电平。

>_<!程序:

a、USART设置,这个要看固件库!首先用结构体把参数配置好,然后调用初始化函数;接着使能接收中断和发送缓冲中断;最后使能USART1。

 void USART_Config(USART_TypeDef* USARTx){
USART_InitStructure.USART_BaudRate = ; //速率19200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
/* Configure USART1 */
USART_Init(USARTx, &USART_InitStructure); //配置串口参数函数
/* Enable USART1 Receive and Transmit interrupts */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲空中断
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}

b、配置系统时钟72MHz+外设时钟使能。注意这里有复用,所以要使能复用时钟。

 void RCC_Configuration(void){
SystemInit();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO , ENABLE);
}

c、 LED的GPIO口配置和复用的A9,A10用于数据收发

 void GPIO_Configuration(void){
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1控制--PB5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
}

d、中断向量初始化,看固件库!

 void NVIC_Configuration(void){
/* 结构声明*/
NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */
/* Configure one bit for preemption priority */
/* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ; //抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ; //子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}

e、Main函数:rec_f为有效帧标志位

 int main(void){
uint8_t a=;//LED高低电压控制
RCC_Configuration(); //系统时钟设置
NVIC_Configuration(); //中断源配置
GPIO_Configuration(); //端口初始化
USART_Config(USART1); //串口1初始化 while (){
if(rec_f==){ //判断是否收到一帧有效数据
rec_f=;
for(i=;i<sizeof(TxBuffer1);i++)//发送字符串
{
USART_SendChar(USART1,TxBuffer1[i]);
Delay(0x0000ff00);
}
if(a==){GPIO_SetBits(GPIOB, GPIO_Pin_5);a=;} //LED1 明暗闪烁
else{GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=;}
}
}
}

这里发送函数封装为:

 void USART_SendChar(USART_TypeDef* USARTx,uint8_t data){
USART_SendData(USARTx,data);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}

接收函数在中断函数中,当上位机发送数据给单片机时,单片机将进入该中断服务程序,进行数据接收,这里上位机发送的数据必须以0x0d和0x0a结尾,如果不是以这两个结尾说明不是有效帧,则不处理:

 void USART1_IRQHandler(void)      //串口1 中断服务程序
{
unsigned int i;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //将读寄存器的数据缓存到接收缓冲区里
if(RxBuffer1[RxCounter1-]==0x0d&&RxBuffer1[RxCounter1-]==0x0a)//判断结束标志是否是0x0d 0x0a
{
for(i=; i< RxCounter1; i++) TxBuffer1[i] = RxBuffer1[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发
rec_f=; //接收成功标志
TxBuffer1[RxCounter1]=; //发送缓冲区结束符
TxCounter1=RxCounter1;
RxCounter1=;
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止发缓冲器空中断,
}
}

资源下载链接:http://pan.baidu.com/s/1gdBY939

[stm32] USART USART1收发功能工程的更多相关文章

  1. STM32串口USART1的使用方法和程序

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...

  2. 单片机stm32 USART串口实际应用解析

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  3. 使用 VSCode 给STM32配置一个串口 printf 工程

    使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...

  4. TX2平台CAN总线收发功能的测试

    前言 项目实现过程中需要将获取的数据信息通过CAN总线传输到控制规划模块,本文主要介绍如何在TX2平台测试CAN总线的收发功能. TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,TX1 ...

  5. stm32 USART rs485 rs232

    转载自:http://www.cnblogs.com/chineseboy/archive/2013/03/06/2947173.html 前题: 前段时间,在公司调试了一个项目,很简单,但对于初学的 ...

  6. STM32串口USART1的使用方法

    前言: 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的   波特率选择,支持同 ...

  7. stm32 usart 异步传输示例

    STM32F103xE的USART异步数据传输示例 USART全称Universal Synchronous/Asynchronous Receiver/Transmitter,是一种可以进行同步/异 ...

  8. STM32 USART 波特率计算

    The baud rate for the receiver and transmitter (Rx and Tx) are both set to the same value as program ...

  9. stm32 usart 串口

    比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps).如每秒钟传送240个字符, 而每个字符格式包含10位(1个起始位.1个停止位.8个数据位),这时的比特率为: 10位 × 240个/秒 = ...

随机推荐

  1. [转]LIBSVM-3.18在python环境下的使用

    http://blog.csdn.net/lj695242104/article/details/39500039 1)安装Python,直接去官方网站 2)运行“cmd”,直接输入python,查看 ...

  2. spring3.0事务管理配置

    转载:http://war-martin.iteye.com/blog/1396335 第一种配置方法:基于XML的事务管理 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的 ...

  3. maven中添加servlet、jsp依赖

    或者在eclipse中,右键项目名称->Maven->Add Dependency->输入servlet,会自动找到最新的版本(记得联网哦),如图:

  4. Selenium2+python自动化24-js处理富文本(带iframe)

    前言 上一篇Selenium2+python自动化23-富文本(自动发帖)解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的 ...

  5. linux 下搭建 storm

    搭建storm  需要搭建: 1.zookeeper 搭建 2.下载/安装 storm 的依赖包  zeromq, jzmq,python 2.storm 搭建 一.Zookeeper 安装 下载安装 ...

  6. .net下各个数据类型所占用的字节

    Console.WriteLine(sizeof(int)); Console.WriteLine(sizeof(short)); Console.WriteLine(sizeof(char)); C ...

  7. WPF中ListBox的样式设置

    设置之后的效果为

  8. Caffe(卷积神经网络框架)介绍

    Caffe(卷积神经网络框架)Caffe,全称Convolution Architecture For Feature Extraction caffe是一个清晰,可读性高,快速的深度学习框架.作者是 ...

  9. 360极速浏览器UA怪异以及如何用js判断360浏览器

    本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...

  10. Jungle Roads

    Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid ...