使用了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个元素的字符数组,更多字符的接收没有测试。。。)
上一篇:STM32JTAG调试接口PB3、PB4复用问题
下一篇:STM32 I/O 作为外部中断输入
推荐阅读
史海拾趣
随着公司技术的不断成熟和产品的多样化,EBK Kruger开始将目光投向国际市场。公司参加了多个国际电子展会,并成功与多家国际知名企业建立了合作关系。通过与这些企业的合作,EBK Kruger不仅扩大了市场份额,还学到了先进的国际管理经验和技术知识,为公司的发展注入了新的活力。
为了提升产品质量和满足客户需求,EBK Kruger开始建立严格的质量管理体系。公司引进了国际先进的生产设备和检测设备,并对员工进行了系统的质量培训。通过不懈的努力,EBK Kruger的产品质量得到了显著提升,赢得了客户的广泛赞誉。同时,公司还获得了多项国际质量认证,进一步提升了品牌形象。
在军队取得初步成功后,APM Hexseal的产品开始进入工业和商业市场。其硅胶密封套系列可与世界各地使用的绝大多数开关、断路器、编码器、电位计和其他旋转设备配合使用,得到了广泛的认可和应用。无论是航空电子、仪器仪表、通讯还是建筑、船舶、医疗等行业,APM Hexseal的产品都发挥着重要的作用。
在技术创新的基础上,Euvis Inc公司积极拓展市场,通过与国际知名电子产品制造商的合作,将其产品应用于各类高端电子产品中。同时,公司注重品牌建设,通过一系列营销活动提升品牌知名度和美誉度。随着市场份额的不断扩大,Euvis Inc公司逐渐在电子行业中树立起了高端、可靠的品牌形象。
随着大飞机项目的立项,中国的航空事业掀开了崭新的一页。民用航空产品要投入运营,就必须取得适航当局颁发的适航证。 RTCA/DO-254《机载电子设备设计保障指南》是美国联邦航空局(FAA)、欧洲航空安全局(EASA)、中 ...… 查看全部问答∨ |
|
哪位好心人有请帮帮忙呀! MP4 codec只做测试用,非商业用途! Email:lovelife_821106@163.com… 查看全部问答∨ |
我用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 ...… 查看全部问答∨ |
定义了一个数组 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控制sed1335的程序 总是有错误提示 >> error: can\\\'t allocate .ebss (sz: 000025d8 page: 1) in DRAMH0 (avail: 00000f7c) >> error: er ...… 查看全部问答∨ |