使用了STM32CubeMX及Keil (HAL库)
材料:stm32开发板、USB转TTL?CH340模块、杜邦线、st-link

实验原理:

模拟了异步半双工通信

波特率可变

起始位:1
数据位:8
停止位:1
(1个数据10位)
无校验位


传输一个字符的时候先发送1位起始位,然后是8位数据位(从低位到高位),最后是一位停止位


用1个普通的GPIO口输出(模拟TXD),模拟了以上发送的高低电平,采用定时器延时(一个位对应的电平的持续时间为1000000/波特率 μs)
用1个普通的GPIO口中断输入(模拟RXD),模拟了接收,下降沿触发中断,采用定时器延时,大概在数据位中央采集1次电平数据

实验设计:
使用了PA1作TXD,PA2作RXD,然后连到CH340模块再连到电脑
TIM2延时

实验过程:


测试使用9600的波特率

一开始只实现了初始时发送“hello”,以及环回测试的2位数据正确收发。。。

推断PA1发送功能应该成功了(然而经过逻辑分析仪检测PA1发送的一个位的延时达到106us左右,正常情况应该是104us),PA2接受功能有bug,一次只能正确接受2位数据,后面收到的都是错误的字符,推测是延时上时间误差的问题,而且会自增像空格一样的字符(经过逻辑分析仪的检测其实是ascii码为255的字符,多次测试发现应该是接受完所有字符后又触发了中断,然而后面都是高电平,所以就收到了这个字符)。。。

错误的结果:



然后根据推测改代码,把接收数据中的延时时间改小,忽略掉ascii码为255的字符(简单粗暴的方法。。。)

正确的结果:



STM32CubeMX中的主要设置:







主要代码(以下只有USER CODE BEGIN里的代码):

/* USER CODE BEGIN Includes */

#include

/* USER CODE END Includes */

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint32_t baudrate=9600;  //设置波特率,比如9600bps

uint8_t message[20]; //收到的字符存放的字符数组

uint8_t length=0; //收到的字符数

uint8_t welcome[]="hello"; //要发送的一个初始信息

uint32_t bit_time;

/* USER CODE END PV */


/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

void delay_us(uint32_t counter);

void transmitChar(uint8_t ch);

uint8_t receiveChar(void);

void transmitString(uint8_t a[]);

/* USER CODE END PFP */

  /* USER CODE BEGIN 1 */

bit_time=1000000/baudrate; //一个位的时间,单位us

  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */

transmitString(welcome); //发送初始信息

  /* USER CODE END 2 */


/* USER CODE BEGIN 4 */

 

//延时counter(us)

void delay_us(uint32_t counter){  

counter++;

HAL_TIM_Base_Start(&htim2);

__HAL_TIM_SET_COUNTER(&htim2,counter);

while(counter>1){

counter=__HAL_TIM_GET_COUNTER(&htim2); 

}

HAL_TIM_Base_Stop(&htim2);

}

 

 

//发送字符

void transmitChar(uint8_t ch){

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,(GPIO_PinState)0);

delay_us(bit_time);

uint8_t i,temp;

for(i=0;i<8;i++){

temp=ch&0x01;

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,(GPIO_PinState)temp);

delay_us(bit_time);

ch>>=1;

}

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,(GPIO_PinState)1);

delay_us(bit_time);

}

 

 

//发送字符串

void transmitString(uint8_t a[]){

uint8_t i,j;

j=strlen(a);

for(i=0;i

transmitChar(a[i]);

}

}

 

 

//接收字符

uint8_t receiveChar(void){

uint8_t bit,i,ch=0;

delay_us(bit_time*1.5);

for(i=0;i<8;i++){

bit=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2);

ch>>=1;

if(bit){

ch=ch|0x80;

}

delay_us(bit_time);

}

delay_us(bit_time*0.2);

return ch;

}

 

 

//GPIO的中断回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(GPIO_Pin);

uint8_t ch;

ch=receiveChar();

if(ch=='#'){

uint8_t i;

for(i=0;i

transmitChar(message[i]);

}

length=0;

}

else if(ch!=255){

message[length++]=ch;}

}

 

/* USER CODE END 4 */



实验成果:


实现了19个字符以内的正确收发(20个元素的字符数组,更多字符的接收没有测试。。。)


关键字:STM32F103RCT6  普通IO口  模拟串口 引用地址:用STM32F103RCT6的普通IO口模拟串口的实验

上一篇:STM32JTAG调试接口PB3、PB4复用问题
下一篇:STM32 I/O 作为外部中断输入

推荐阅读

据外媒报道,QuantumScape将与大众成立一家合资公司,旨在实现固态电池的工业级量产,双方计划在2025年建立一条固态锂电池生产线。如今,对未来的电动车而言,固态电池电芯是最具前景的一项技术。该项电池技术还能提升当前锂离子电池的能量密度、增强其安全性并提升其快充能力。此外,大众在德国成功完成QuantumScape固态电池早期样品的测试。据耶鲁的分析...
stm32串口1的配置if EN_USART1_RX //如果使能了接收//串口1中断服务程序//注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.//接收状态//bit15, 接收完成标志//bit14, 接收到0x0d//bit13~0, 接收到的有效字节数目u16 USART_RX_STA=0; //接...
  引言  射频识别(RFID)技术近年来在国内外得到了迅速发展。对于需要电池供电的便携式系统,功耗也越来越受到人们的重视。本文将具体阐述基于 MSP430 F2012和CC1100低功耗设计理念的双向有源标签的软硬件实现方法。  低功耗设计  低功耗概述  功耗基本定义为能量消耗的速率,可分为瞬态功耗和平均功耗两类。两者意义不同,有不同的应用背景和...
广告摘要声明广告近日,中科创达与熵智科技达成战略合作关系,发挥各自优势,共同探索工业视觉相关的解决方案,为客户的智能化升级助力。目前2D视觉经过高速的发展,已经进入平台期。3D视觉正处于走向量产的关键时刻,主力应用正渐次从不可为走向可为。继无序抓取逐渐成熟后,焊接和切坡口也曙光初现。由于具备了深度信息,3D视觉也为工业检测增加了新的可...

史海拾趣

问答坊 | AI 解惑

大飞机计划指南RTCA/DO-254

  随着大飞机项目的立项,中国的航空事业掀开了崭新的一页。民用航空产品要投入运营,就必须取得适航当局颁发的适航证。     RTCA/DO-254《机载电子设备设计保障指南》是美国联邦航空局(FAA)、欧洲航空安全局(EASA)、中 ...…

查看全部问答∨

Altera官方开发板资料下载网址

http://www.terasic.com/downloads/cd-rom/ …

查看全部问答∨

Proteus怎么装

这个高级货色 怎么装不起哦,我下的是7.6的版本,俩补丁,一个。96还有一个是1.00到底用哪个?我都装了跑程序还是不行啊…

查看全部问答∨

求Wince下的GraphEdit及MP4 codec

哪位好心人有请帮帮忙呀! MP4 codec只做测试用,非商业用途! Email:lovelife_821106@163.com…

查看全部问答∨

wince如何打开即时通知?

我用lineopen打开线路的时候,最后的调试信息为: CellTSP : i : TSPI_lineOpen : Line open - HDRVLINE=0 CellTSP : i : TSPI_lineOpen : RIL supports Call Progress Notifications. CellTSP : i : TSPI_lineOpen : RIL supports Call Progres ...…

查看全部问答∨

关于继电器

在proteus和keil中用继电器控制照明灯,keil程序和proteus电路图如下,可是就是看不到效果,请各位大虾指点一下: #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit s1=P1^0; sbit out=P2^4; void delay ...…

查看全部问答∨

串口发送的数据全部变成0了,好奇怪!!顶也有分啊

定义了一个数组 xdata unsigned char ComInit[17]=0x02,0x00,0x11,0x03,0xAA,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xB9,0x03}; 每秒发送一次给PC机 sendString(ComInit, 17);  //发送函数 本来一切都正常,后来工程中 ...…

查看全部问答∨

2812的一些问题 求助

我正在做2812控制sed1335的程序 总是有错误提示 >>   error: can\\\'t allocate .ebss (sz: 000025d8 page: 1) in DRAMH0 (avail:             00000f7c) >>   error: er ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved