c语言串口通讯发射用IO口模拟,STM32F103C8T6使用普通IO口模拟串口收发

本文介绍了如何在STM32F103C8T6上使用普通GPIO口模拟串口通讯,特别是在硬件串口资源已满的情况下。通过非阻塞式通讯方式,利用定时器实现串口的发送功能,详细讲解了发送函数和定时器中断服务程序的实现过程。
摘要由CSDN通过智能技术生成

导:

由于项目系统功能版本升级,需要开发一个带有串口收发的功能,但是硬件串口已经全部使用,发现还剩余部分普通gpio口可以使用,故打算采用软件模拟的方法实现该功能;

很久以前使用过51单片机来实现过类似功能,现在首次使用stm32来实现该功能;先借鉴一些网上的demo;

产品的代码初始框架不是我自己搭建的,下回轮到我来搭,一定一定用操作系统来完成,要不然资源的配置,考虑太多,真的麻烦死了;

参考:https://blog.csdn.net/yunjie167/article/details/79808464

1.阻塞的通讯

阻塞式通讯

51单片机,是没有操作系统的,并且定时器也是非常的有限的;所以再模拟iic通讯,或者模拟SPI,或者模拟串口uart通讯的时候,通讯是需要delay来延时(delay函数)的位置;延时函数往往是让系统空闲下来等待做不其他事情,很浪费系统的时间资源(这种等待占用了系统时间做“无用之事”,具“阻塞”作用);比如下方这个:使用定时器来计时!

{这个算是稍微高级一点的延迟处理(比单纯的i--好),这个只要将其优先级别放到最低,既可实现不影响中断的处理!}

ee671315c0e10e278599d4640804e290.png

STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,常用于嵌入式系统开发。若要通过其IO(通常指的是GPIO)通过串口(如USART)发送38kHz的方波信号,你可以按照以下步骤操作: 1. **配置硬件连接**: - 将需要作为输出的GPIO设置为推挽输出模式。 - 配置串口通信,比如选择USART1、USART2或USART3,并配置好波特率、数据位、停止位和校验位等参数。 2. **生成38kHz信号**: - STM32F103的定器可以用于生成频率精确的脉冲。例如,可以使用TIM1或者TIM2配置成PWM模式,将周期设为晶振周期的约五分之一(取决于实际晶振频率),然后计算出占空比大约为90%(38kHz相对于50kHz)。 3. **发送信号**: - 在每两个周期之间切换GPIO状态,即高电平和低电平,这会在串口上形成一个接近38kHz的方波。在C语言中,你可以编写一个无限循环,定改变GPIO的状态。 4. **串口发送**: - 使用STM32提供的串口发送函数(如HAL_USART_Transmit),在GPIO状态变化将相应的字符(通常是方波的逻辑编码,如0x55和0xAA代表高低电平)发送到串口。 ```cpp // 示例代码片段 void generatePulse(TIM_HandleTypeDef* timHandle); void sendPulseThroughUSART(GPIO_TypeDef* gpio, uint8_t pin); void setup() { // 初始化GPIO和USART HAL_GPIO_Init(gpio, ...); HAL_USART_Init(&huartInstance, ...); // 设置定器 TIM_HandleTypeDef htim; TIM_TimeBaseInitTypeDef timerInitStructure = {...}; HAL_TIM_Base_Init(&htim); HAL_TIM_Base_Start_IT(&htim); // 开始发送 generatePulse(&htim); } void generatePulse(TIM_HandleTypeDef* timHandle) { while (1) { TIM_GenerateEvent(timHandle); // 触发TIM事件,由中断处理程序切换GPIO状态 HAL_Delay(1); // 确保每个周期稳定 } } void sendPulseThroughUSART(GPIO_TypeDef* gpio, uint8_t pin) { GPIO_SetBits(gpio, pin); HAL_USART_Transmit(&huartInstance, (uint8_t*)"\xFF", 1, HAL_MAX_DELAY); // 发送高电平 GPIO_ResetBits(gpio, pin); HAL_USART_Transmit(&huartInstance, (uint8_t*)"\x00", 1, HAL_MAX_DELAY); // 发送低电平 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值