使用了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 作为外部中断输入
推荐阅读
史海拾趣
随着云计算和大数据技术的兴起,计算机行业迎来了新一轮的变革。Computer Conversions Corp公司迅速调整战略,开始研发与云计算相结合的新型转换设备。通过不断地技术革新和产品迭代,公司成功推出了一系列高效、稳定的云计算转换解决方案,帮助众多企业顺利迁移到了云平台,从而保持了在行业中的领先地位。
随着公司实力的不断增强,C-MAC Automotive公司开始实施全球化战略。公司先后在欧美和亚洲等地设立研发中心和生产基地,以便更好地满足当地市场需求。通过全球化布局,C-MAC不仅拓宽了市场渠道,还降低了生产成本,提升了整体竞争力。此外,公司还积极参与国际技术交流和合作,不断提升自身的技术水平和创新能力。
作为一家有社会责任感的企业,Elpac公司始终关注环境保护和可持续发展。公司积极采用环保材料和清洁能源,努力降低生产过程中的能耗和排放。同时,Elpac公司还积极参与各种公益活动和社会事务,回馈社会、关爱弱势群体。这些举措不仅提升了公司的品牌形象和社会影响力,也为公司的长远发展注入了正能量。
以上是关于电子行业里某假设性“Elpac公司”的发展故事,希望对您有所帮助。
随着业务的不断发展,Elpac公司开始将目光投向国际市场。公司制定了全球化战略,积极开拓海外市场。为了更好地适应不同国家和地区的市场需求,Elpac公司针对不同地区推出了定制化的产品和服务。同时,公司还加强了与国际知名企业的合作,共同研发新技术、新产品。这些举措不仅让Elpac公司的产品在全球市场上得到了广泛认可,也为公司的长远发展奠定了坚实基础。
Barry Industries Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。
2003年,AMOTECH的压敏电阻产品被产业资源部评为“世界一流产品”,这是对公司技术实力的再次肯定。同年,公司还在韩国安全商协会进行了自动报价首次公开募股,为公司的发展筹集了更多资金。随着实力的增强,AMOTECH开始将目光投向海外市场。2004年,公司在山东建立了首家海外工厂,专注于全球定位系统天线的生产,这标志着公司国际化战略的正式启动。
各位大哥,小弟刚学单片机遇到一个问题,希望大家不吝赐教,先行谢过了。 单片机用的是ATMEGA8L,编译用的是ICCAVR,可是一编译就显示出错 F:\\AVR\\ICCAVR\\icc\\bin\\imakew -f test1.mak iccavr -c -IF:\\AVR\\ICCAVR\\icc\\include\\ ...… 查看全部问答∨ |
用max038产生的高频信号有很大的干扰如何滤除??产生的波形很粗!!!仔细看像扭得麻花?????这如何解决???为什么4051不能换挡??这也是个麻烦事!!希望哪个专家高手给点意见和经验!!!谢谢!!… 查看全部问答∨ |
#include <std.h> #include <swi.h> #include <csl_edma.h> #include <csl_irq.h> #include <csl_mcbsp.h> #include \\"aic23.h\\" #include <csl_cache.h> #include \\"switestcfg.h\\" Uint32 i; Ui ...… 查看全部问答∨ |
|
我想不重烧NK,修改wince6开机画面,mini2440平台,求教 我查看了下,startlogo.c里面的logo数组便宜到了nk.exe中,但是我在wince6中把windows下面的nk。exe替换了,开机画面仍然不变,求教如何实现不重烧nk实现换wince开机画面的方法(非nboot画面)… 查看全部问答∨ |
小弟在用MCU为 STM32F103ZET6 的一块板子学习当中,现在USART和CAN已经分别调通。 现在想请教一下各位高手: 我手边有一台可以通过232串口与PC通讯的机器,是通过PC上一个软件发送指令来控制通讯,但是限于232传输距离不够,我想先用我自己板子上 ...… 查看全部问答∨ |