STM32之旅4——USART
STM32之旅4——USART
串口也是用的比较多的,在STM32CubeMX中生成代码后,需要添加一些代码才可以用。
drv_usart.h:
#ifndef __DRV_USART_H
#define __DRV_USART_H
#define USART1_MAX_LEN 64 //接收区长度
#define USART1_BUFF_CACHE_LEN 1 //接收缓冲区长度
extern uint16_t g_usart1_sta; //接收状态[1:15],最高位为接收完成标志
extern uint8_t g_usart1_buff[USART1_MAX_LEN]; //接收buff
extern uint8_t g_usart1_buff_cache[USART1_BUFF_CACHE_LEN]; //接收缓存
#endif
使用printf()发送的时候需要重定向,没有fputc()是不行的;使用中断接收的时候,并不是在USART1_IRQHandler()里面添加代码,而是在回调函数HAL_UART_RxCpltCallback()中写,接收完成时要在后面加上HAL_UART_Receive_IT(),串口初始化时也要加上HAL_UART_Receive_IT(),否则不能进中断。
drv_usart.c:
#include "stm32f1xx.h"
#include "drv_usart.h"
#include "stdio.h"
#include "usart.h"
uint16_t g_usart1_sta;//接收状态[1:15],最高位为接收完成标志
uint8_t g_usart1_buff[USART1_MAX_LEN];
uint8_t g_usart1_buff_cache[USART1_BUFF_CACHE_LEN];
/***********printf函数重写,有了这个函数就可以使用printf()发送串口数据了**********/
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return 0;
}
/****************************串口中断回调函数*************************************/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(USART1 == huart->Instance)
{
if(0 == (g_usart1_sta & 0x8000))//接收未完成
{
g_usart1_buff[g_usart1_sta++] = g_usart1_buff_cache[0];
if(0x0A == g_usart1_buff_cache[0])//如果接收到回车,就接收完成
{
g_usart1_sta |= 0x8000;
}
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)g_usart1_buff_cache,USART1_BUFF_CACHE_LEN);
}
}
这里没加HAL_UART_Receive_IT()是不会进进中断的。
usart.c:
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart1,g_usart1_buff_cache,USART1_BUFF_CACHE_LEN);
}
STM32之旅4——USART的更多相关文章
- STM32之旅5——IWDG
STM32之旅5--IWDG stm32有两个看门狗,一个独立看门狗(IWDG).一个窗口看门狗(WWDG):独立看门狗是时钟源是内部的40kHz的低速时钟,即使主频出问题了,独立看门狗也不会受到影响 ...
- STM32之旅3——时钟数
STM32之旅3--时钟数 STM32F1是M3内核,它的时钟数很庞大,让一个初学者去看,估计会很吃力,和我们入门的8051单片机的时钟不同,这里又倍频.又分频,而且还分成好多个时钟,不同的外设时钟不 ...
- STM32之旅2——按键
STM32之旅2--按键 几乎每个项目都有用到按键,为了避免以后在做大项目的时候还在琢磨按键怎么写,现在写一个,方便以后使用.这里是最简单的独立按键驱动方法,和学习51单片机是的一样,更好的方 ...
- STM32之旅1——LED
STM32之旅1--LED 学习了51单片机后,就要接触到更高级一点的单片机了,比如STM32,ST也有很多款单片机,现在用比较基础的学习--STM32F103RCT6. LED驱动 hal库的使用比 ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
- STM32(6)——USART串口的使用
1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用 ...
- STM32 C++编程 003 USART(串口)类
使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...
- 【STM32学习笔记】USART 硬件流控
流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口.流控的定义.大家一定了解,RS232 中的"RS"是Recommend Standard 的缩写,即&qu ...
- STM32之旅6——WWDG
WWDG是stm32f103的窗口看门狗,使用的时钟是APB1的时钟,在使用wwdg是被一个小问题困扰了很久--没有打开中断,无法喂狗,一直复位. 初始化完之后需要使能中断: __HAL_WWDG_E ...
随机推荐
- Motion Matching 资料汇总
https://www.gdcvault.com/play/1023280/Motion-Matching-and-The-Road https://twvideo01.ubm-us.net/o1/v ...
- Codeforces Round #571 (Div. 2)-D. Vus the Cossack and Numbers
Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He ...
- Oracle 回滚段undo
Undo的作用 数据的回滚 一致性读 表的闪回(事务,查询的闪回..) 失败会话的恢复 回滚rollback操作 SQL> archive log list; ORA-01031: 权限不足 S ...
- C# aspx 禁止文本款输入缓的几种方法
1 在ASP.NET中可以在页面中加入以下内容: <%@ OutputCache Location="None" VaryByParam="None" ...
- 20190926-02Redis五大数据类型之Set 000 028
- [Java数据结构]LinkedHashMap,TreeMap
HashMap不能记住插入时的顺序,但LinkedHashMap可以做到这一点. 例程: Map<Integer,String> empMap=new LinkedHashMap<I ...
- 【Flutter 实战】1.20版本更新及新增组件
老孟导读:Flutter 1.20 更新了 Slider.RangeSlider.日期选择器组件.时间选择器组件的样式,新增了交换组件:InteractiveViewer,下面详细介绍其用法. 滑块 ...
- 利用jquery的$.Deferred方法在一个函数内获取另一个函数的返回值
使用场景:方法B需要方法A执行完成之后再执行,比如方法B中有用到方法A的变量:(需要引入jQuery1.5以后的版本) function A(){ var deffered = new $.Defer ...
- Vue 侦听器 watch
1. 侦听器 watch Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性 当属性发生改变时,自动触发属性对应的侦听器. 当需要在数据变化时执行异步或开销较大的操作时,这 ...
- C#开发PACS医学影像处理系统(三):界面布局之工具栏
工具栏布局采用WPF中Grid作为容器,按钮采用自定义样式和图标,并采用Separator分割线: XAML设计器代码: 其中 Style="{StaticResource ButtonS ...