历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2018年09月09日 | 用STM32F103RCT6的普通IO口模拟串口的实验

2018-09-09 来源:eefocus

使用了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个元素的字符数组,更多字符的接收没有测试。。。)


推荐阅读

史海拾趣

DIOTEC公司的发展小趣事

为了进一步完善全球产业布局,DIOTEC于2007年在印度普纳建立了新的生产基地。这座工厂紧邻印度的“门户城市”孟买,为DIOTEC在印度市场的拓展提供了有力支持。印度工厂的投产,不仅加强了DIOTEC在全球市场的竞争力,也进一步巩固了其在亚洲市场的地位。

高创科技(gotrend)公司的发展小趣事

为了进一步完善全球产业布局,DIOTEC于2007年在印度普纳建立了新的生产基地。这座工厂紧邻印度的“门户城市”孟买,为DIOTEC在印度市场的拓展提供了有力支持。印度工厂的投产,不仅加强了DIOTEC在全球市场的竞争力,也进一步巩固了其在亚洲市场的地位。

ECI公司的发展小趣事

ECI公司深知人才是企业发展的关键因素。因此,公司高度重视人才的引进、培养和激励。公司建立了完善的人才选拔机制,选拔具有潜力和才华的员工进行重点培养。同时,公司还提供了丰富的培训和发展机会,帮助员工提升自身素质和能力。此外,ECI还建立了科学合理的薪酬制度和激励机制,让员工在为公司创造价值的同时也能获得相应的回报。这种对人才的重视和投入让ECI公司汇聚了一批优秀的员工队伍,为公司的发展提供了有力的保障。

Cellergy公司的发展小趣事

为了进一步扩大市场份额,Cellergy公司积极寻求与其他电子企业的战略合作。通过与一家知名电子产品制造商的合作,Cellergy公司的电容器产品得以进入更广阔的市场。双方共同研发新产品,共享技术和市场资源,实现了互利共赢。这一合作不仅提升了Cellergy公司的知名度,也为其带来了更多的商业机会。

Block USA Inc.公司的发展小趣事

在发展过程中,Block USA Inc.也面临着来自竞争对手和行业变化的挑战。然而,公司始终保持着创新精神,不断调整和优化产品与服务,以适应市场的变化。例如,面对数据安全和隐私保护的日益严格要求,Block加强了其数据保护措施,并公开承认了数据泄露事件并积极采取措施进行补救。同时,公司还继续拓展其业务边界,探索新的增长点,以保持其在电子行业中的竞争优势。

这些故事只是Block USA Inc.在电子行业发展历程中的一部分,它们展示了公司如何通过不断创新和拓展业务领域,逐步成为一家具有影响力的综合性电子企业。然而,随着市场的不断变化和竞争的加剧,Block仍需保持警惕并持续努力,以应对未来的挑战和机遇。

Altus Technology Inc公司的发展小趣事

Altus深知人才是企业发展的根本。因此,公司一直注重人才培养和引进工作。通过建立完善的培训体系和激励机制,Altus吸引了大量优秀人才加入公司,并为他们提供了广阔的发展空间和职业晋升机会。这些人才在公司的各个岗位上发挥着重要作用,推动了公司的技术创新和市场拓展。同时,Altus还注重员工的福利待遇和文化建设,营造了积极向上、团结和谐的工作氛围。

问答坊 | AI 解惑

SUPERSYNC PWB-1537、SUPERSYNC EM-1428二种机型彩色显示器的电源电路图

SUPERSYNC PWB-1537、SUPERSYNC EM-1428二种机型彩色显示器的电源电路图…

查看全部问答>

一些变频器说明书

大家共享,希望大家有更多的变频器,PLC,伺服驱动等资料与大家共享 [ 本帖最后由 yurongchun 于 2008-5-27 10:38 编辑 ]…

查看全部问答>

05月11日 CPU部分电路图,待商榷版

昨天花了一天时间画的原理图,这是CPU控制部分,与数据采集板的接口部分还没有打网络标号(包括电平转换的芯片),打算先把这一块板给做出來调软件,本来打算用LPC2103作为从控制器,后来画到后面想想还是换成了MSP430F135,因为LPC2103要用双电源供电,如果 ...…

查看全部问答>

ST五张图片展现STM8L的低功耗

太阳能供电 一块土豆就可以供电,相比较某些产品用苹果展示,土豆应该是更省电的吧,呵呵 利用RF无线传输能量 利用手摇电筒制作成发电机供电 一杯热水就能供电?杯子底部的热电偶产生电能,一样可以供MCU使用 背景资料: 意法半 ...…

查看全部问答>

初次面试时的小贴士

初次/电话面试一般会比较笼统,建议应聘者从以下几个方面准备:          1. 面试前要浏览这家公司的网页以及相关信息,了解一下她的历史、业务情况等等。     2. 一般面试会问到你对未来3-5年内自己职业发展方向的规划,先考虑 ...…

查看全部问答>

自制简单LED频闪灯

在千篇一律的DIY、MOD场合里,许多玩家费尽心机所改造出来的灯光效果都是静止的,如果在Lanparty上千人一面的改造MOD比比皆是,你的改造又怎么能脱颖而出呢?增加一个动感的超炫灯光效果势在必行!想像一下在姹紫嫣红的炫目光彩照耀下,观众早已疲 ...…

查看全部问答>

在获取滚动条的SB_THUMBPOSITION事件位置值,总是不对

当触发滚动条的SB_THUMBPOSITION事件时,我把滚动条的滑块托到最后,得到值不是SCROLLINFO中的nMax值,为什么啊。…

查看全部问答>

猎头职位:Hardware Design Engineer (欧洲一家做控制系统的公司,地点:上海)

Listed in London Stock Exchange, our client is a global group of five businesses that supply control and automation solutions that deliver efficiency, safety and effectiveness in process automation, controls and transportation e ...…

查看全部问答>

请问下PXA270和基带是如何通信的?

请问下PXA270和基带是如何通信的?是不是通过UART口发送AT Command啊? 比如打电话功能是发送一个ATD……的命令给基带么? …

查看全部问答>

Altera CycloneIII FPGA锁相环输出问题

输入时钟为27M,通过锁相环倍频成270M,270M是ASI IP核使用的时钟。目前有8个PCB,可以正常使用的有4个,不能正常使用的有4个,同样的FPGA程序。不能正常使用的PCB中,signaltap使用此270M做采样时钟,会显示waiting for clock 或者采出很乱的波形 ...…

查看全部问答>