完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、寄存器与基于固件库的stm32 LED流水灯的差异
(一)基于寄存器的LED流水灯程序 1、stm32f10x.h /*片上外设基地址 */ #define PERIPH_BASE ((unsigned int)0x40000000) /*总线基地址,GPIO 都挂载到 APB2 上 */ #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE +0x20000) /*GPIOC 外设基地址*/ #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) //GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址 /* GPIOB 寄存器地址,强制转换成指针 */ #define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) #define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04) #define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08) #define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C) #define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10) #define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14) #define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18) /*RCC 外设基地址*/ #define RCC_BASE (AHBPERIPH_BASE + 0x1000) /*RCC 的 AHB1 时钟使能寄存器地址,强制转换成指针*/ #define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18) 2、main.c int main(void) { // 函数为空,目的是为了骗过编译器不报错 void SystemInit(void) { } // 开启 GPIOB 端口时钟 RCC_APB2ENR |= (1<<3); //清空控制 PB0 的端口位 GPIOB_CRL &= ~( 0x0F<< (4*0)); // 配置 PB0 为通用推挽输出,速度为 10M GPIOB_CRL |= (1<<4*0); // PB0 输出 低电平 GPIOB_ODR |= (0<<0); while (1); } (二)基于固件库的LED流水灯程序 1、bsp_led.c //初始化GPIO函数 void LED_GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启LED相关的GPIO外设时钟*/ RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/ GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN; /*调用库函数,初始化GPIO*/ GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); /* 关闭所有led灯 */ GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); /* 关闭所有led灯 */ GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); } 2、main.c #include "stm32f10x.h" #include "./led/bsp_led.h" #define SOFT_DELAY Delay(0x0FFFFF); void Delay(__IO u32 nCount); int main(void) { /* LED 端口初始化 */ LED_GPIO_Config(); while (1) { LED1_ON; // 亮 SOFT_DELAY; LED1_OFF; // 灭 LED2_ON; // 亮 SOFT_DELAY; LED2_OFF; // 灭 LED3_ON; // 亮 SOFT_DELAY; LED3_OFF; // 灭 /*轮流显示 红绿蓝黄紫青白 颜色*/ LED_RED; SOFT_DELAY; LED_GREEN; SOFT_DELAY; LED_BLUE; SOFT_DELAY; LED_YELLOW; SOFT_DELAY; LED_PURPLE; SOFT_DELAY; LED_CYAN; SOFT_DELAY; LED_WHITE; SOFT_DELAY; LED_RGBOFF; SOFT_DELAY; } } void Delay(__IO uint32_t nCount) //简单的延时函数 { for (; nCount != 0; nCount--); } (三)固件库开发与及寄存器开发对比 2、对比基于固件库的库开发方式来说,直接配置寄存器方式的缺点有: (1) 开发速度慢 (2) 程序可读性差 (3) 维护复杂 这些缺陷直接影响了开发效率,程序维护成本,交流成本。库开发方式则正好弥补了这些缺陷。 而坚持采用直接配置寄存器的方式开发的程序员会认为它有以下的优点: (1) 具体参数更直观 (2) 程序运行占用资源少 相对于库开发的方式,直接配置寄存器方式生成的代码量的确会少一点,但因为STM32 有充足的资源,权衡库的优势与不足,绝大部分时候,我们愿意牺牲一点 CPU 资源,选择库开发。一般只有在对代码运行时间要求极苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。 二、STM32的USART窗口通讯 (一)所需仪器/软件 开发板:野火指南者(STM32F103VET6高速版)带3.2寸屏(二)实验前准备 1、把开发板按照说明书连接好,连接到电脑上,拨动左下角开关,红灯亮说明开关打开,新的开发板屏幕显示如手机界面相似的界面。 但是我之前已经烧录了别的程序进去,所以现在屏幕是灭的,等你们烧录程序进去后也会灭,不要慌张,这是正常的。2、安装USB转串口驱动CH340 1)首先保证指南者开发板连接在电脑上 2)打开你购买指南者开发板时获得的资料,点击5-开发软件 3)进去后是几个压缩包,解压,打开USB转串口驱动_CH340 4)然后双击CH341SER进行安装,小窗口出现后点击安装,此时要保证开发板连接在电脑上且处于通电状态,否则会显示安装失败。如图显示则安装成功。 3、安装串口多功能调试助手Fire Tools 1)进入多功能调试助手文件夹 2)打开新版的Fire Tools,进入Fire Tools文件 3)双击打开名称为Fire Tools的应用程序,备用 4)此时显示设置串行口调试设置波特率为115200,1位停止位,无校验位 (三)开始实验 默认你们的Keil5已经安装好,还没安装的同学去安装好了再回来继续看。 1、Keil5源程序准备 1)打开资料中的程序源码_教程文档->《STM32库开发实战指南》->21-USART—串口通信 2)找到USART1接发->Project->RVMDK(uv5)->BH-F103工程文件 3)打开工程如图 2、程序修改 1)找到USER文件下的stm32f10x_it.c文件和main.c文件 2)修改stm32f10x_it.c文件的串口中断服务函数: int i=0; uint8_t ucTemp[50]; void DEBUG_USART_IRQHandler(void) { if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData(USART1); } if(ucTemp == '!') { if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ') if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 's') { printf("收到!"); while(1); } } i++; } 2)修改主函数main.c: #include "stm32f10x.h" #include "bsp_usart.h" void delay(uint32_t count) { while(count--); } int main(void) { USART_Config(); while(1) { printf("hello windows 10!n"); delay(5000000); } } 3)保存并编译,查看是否有程序错误 3、程序调试 1)点击魔术棒,在打开的窗口中选中Output,勾选生成KEX文件 2)选中Debug,在Use窗口选中CMSIS-DAP Debugger 3)下一个Utilities,勾选Use Debug Driver 4)回到Debug选项,进入Settings 5)在Settings中的Debug选项,按照如图设置 如果CMSIS-DAP和SWDIO处没有显示出开发板,首先检查开发板和电脑的连接是否正确,开发板是否通电,若还是显示不出,往下滑到第五、更新驱动 部分参考解决。6)点击Flash Download,按箭头1处设置,此时箭头2所指方框处应显示读取的开发板相关信息,若信息不对,可通过Add添加,按OK确认设置。 4、烧录程序 1)上述配置好后,重新编译检查错误,若正确,点击load把程序烧录到开发板中。 2)烧录过程中左下角有进度条,烧录成功后有如图显示。 (四)实验结果 此时打开刚刚的多功能调试助手,点击左边的打开串口,会看到数据接收区显示程序运行结果,在指令区向程序发送“stop stm32!"的指令,程序停止,且显示”收到!”。 (五)更新驱动 1、打开电脑的设备管理器,找到BETTER_USB,右键点击更新驱动程序 2、选择浏览我的计算机以查找驱动程序软件 3、让我从计算机上的可用驱动程序列表中选取 4、选择USB输入设备,然后下一步 5、更新成功,关闭。回到Keil5程序重新调试和配置,此时应该检测出了相应的开发板。 总结 以上就是STM32 的USART窗口通讯的相关内容。 上一篇博客写着写着就写成今天的上机内容了,但是并不是题目要求,人傻了。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1113浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 05:46 , Processed in 2.221322 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号