我是靠谱客的博主 落后饼干,最近开发中收集的这篇文章主要介绍STM32F103x/Free RTOS系统学习笔记之SR04超声波测距串口输出(1)-CXM,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
前言
这一次使用的是超声波做实验,以前使用51单片机的时候用SR04超声波时总是在while(echo)使得得非常占用资源, 不得已得用中断或者阻塞的方式,较为麻烦,而且融合多个传感器51显得越来越不够用所以我打算从STM32用Free RTOS系统作为平台,实现的效果为实时串口打印超声波测距的数据
目录
前言
1.串口配置和输出
2.定时器配置
3.HC-SR04超声波测距代码
通用配置
超声波初始化
第一种:外部中断检测法
硬件
HC-SR04
STM32F103C6
首先我们使用上一次的搭建好的环境
STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM_CHENxiaomingming的博客-CSDN博客
RTOSstm32F103C6-TROSincFreeRTOSConfig.h
在配置文件中需要吧#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10*1024 ) )
改为#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1024 ) ) 这样编译的文件大小不会超过C6芯片的内存。
1.串口配置和输出
串口基本配置
void uart_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//USART1_TX
GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX
GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//串口中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启串口接受中断
USART_Cmd(USART1, ENABLE);
//使能串口1
}
//字符
void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data) //一个一个字符发送
{
USART_SendData( USARTx, Data);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}
//字符串
void USART_SendStr(USART_TypeDef* USARTx, char* str) //字符串发送
{
uint16_t i=0;
while( *(str+i) != '