完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
在实际应用中往往会出现芯片的串口不够用的情况,此时可以利用多余的IO来模拟串口,实现数据的收发。
在利用IO模拟串口时,按照传输协议进行操作即可。 关键之处在于: 对于发送,计算好不同波特率对应的延时时间进行数据发送。 对于接收,通过外部中断检测接收管脚的下降沿,检测到起始信号后开启定时器,定时器按照波特率设定好时间,每隔一段时间进入定时器中断接收数据,完成一个字节后关闭定时器。 本文的波特率选用9600 发送延时计算: 1/9600≈104us,按照此时间进行数据的发送 #define TX_PIN GPIO_Pin_6 #define RX_PIN GPIO_Pin_7#define TX_DATA_H() GPIO_SetBits(TX_PORT, TX_PIN) //高电平#define TX_DATA_L() GPIO_ResetBits(TX_PORT,TX_PIN) //低电平#define COM_RX_READ GPIO_ReadInputDataBit(RX_PORT, RX_PIN)//端口电平读取12345#define BuadRate_9600 104 //模拟9600的频率enum{ COM_START_BIT, // COM_D0_BIT, //bit0 COM_D1_BIT, //bit1 COM_D2_BIT, //bit2 COM_D3_BIT, //bit3 COM_D4_BIT, //bit4 COM_D5_BIT, //bit5 COM_D6_BIT, //bit6 COM_D7_BIT, //bit7 COM_STOP_BIT, //停止位 };unsigned char recvStat = COM_STOP_BIT;uint8_t recvData = 0;//接收的数据uint8_t len;uint8_t uart_buf[20];//接收缓冲区1234567891011121314151617void VirtualCOM_Config(void){ VirtualTx_Config();//发送端口初始化 EXITRx_Init();//接收端口初始化,及接收中断配置 TIM2_Configuration(103,71); //设置对应模特率的定时器的定时时间}123456发送端口配置 void VirtualTx_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //为数据输出口,模拟TX GPIO_InitStructure.GPIO_Pin = TX_PIN; //PA.6 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TX_PORT, &GPIO_InitStructure); GPIO_SetBits(TX_PORT, TX_PIN); }1234567891011void EXITRx_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //为数据输入口,模拟RX GPIO_InitStructure.GPIO_Pin = RX_PIN; //PA.7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RX_PORT, &GPIO_InitStructure); //GPIOA.7 中断线以及中断初始化配置下降沿触发 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7); EXTI_InitStructure.EXTI_Line = EXTI_Line7; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}void TIM2_Configuration(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //定时器TIM2初始化:t= (arr+1) *(psc+1) / Tck_tim TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }void VirtualCOM_ByteSend(uint8_t Data){ uint8_t i; TX_DATA_L(); // 发送起始位 delay_us(BuadRate_9600); for(i=0; i<8; i++) // 发送8位数据位 { if (Data & 0x01) TX_DATA_H(); // 1 else TX_DATA_L(); // 0 Data >>= 1; delay_us(BuadRate_9600); } TX_DATA_H(); // 发送结束位 delay_us(BuadRate_9600);}void SendBytes(u8 *str,u8 len) { u16 i; for(i=0; i |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1801 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
745浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
579浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 12:06 , Processed in 1.078471 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号