完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/F1和F4的异同/
如果是基于HAL来开发,由于HAL的可移植性好,F1上的主程序代码和F4上基本没啥差别。 F1的内核时CortexM3,F4的内核时CortexM4 F4通过HAL库编程与F1最大的区别是在外设的时钟上。 不同内核所包含的指令集如下图 使用不同型号的Fx,相应的system文件例如delay.c delay.h sys.h 里面会有些许的差别 ,直接复制黏贴例程的就行 HAL库知识补充 /遇到并解决的错误/ 出现: error: #29: expected an expression 一般是在前后行或者相关定义声明前后出现中文字符(很可能是中文括号或者看不见的空格字符) 出现“无法识别的预处理指令”错误 当一个头文件被多个头文件调用的时候,就会出现重复定义的情况 所以要使用#ifndef #define #endif 来避免重复定义 出现“error: #20: identifier "uint16_t" is undefined” / 位带操作 / 32MB的“位带别名区”对应1MB的“位带区” 对位带别名区每个字节的操作对应位带区比特位的操作 对位带别名区的访问操作,将“读-改-写”做成了硬件级别支持的操作,不能被中断打断。 / 软件仿真 / 将上面的内容改为下面的,否则可能不能用逻辑分析仪对特定引脚进行分析 逻辑分析窗口:在serup里添加需要进行分析的引脚(如PORTB.5) 点击Peripherals可以查看寄存器设置 / 外部中断的应用/ STM上的各种外设,是通过内部信号来协同工作的,这个信号,就可以理解为事件。 可以在寄存器中读取到事件状态的标志,称该事件是可见的。如无法读取,则该事件不可见。 在stm32中,绝大多数事件是不可见的,所以这些事件几乎都是与中断功能绑定在一起的。 EXTI外设大致可分为两种功能:
通过AFIO来设置中断源的输入,可以直接用cubeMX生成,不用了解太细,知道GPIO和中断线的对应关系就行。 AFIO(alternate function IO) 用cubeMX配置外部中断 (句柄的定义如下图) NVIC(Nested vectoredinterrupt controller,即嵌套向量中断控制器): 相应寄存器 ISER(Interrupt Set-Enable Registers):用来设置使能某个中断 ICER(Interrupt Clear-Enable Registers:用来清除中断位 上面这些寄存器都是写1有效,写0无效的寄存器。所以只要往相应位写入1,即可以完成相应操作(只需要单一的“写”指令即可完成操作,而不需要“读-改-写”) 因此就可以很方便地通过调用宏定义来完成操作了 类似例子 中断触发流程 中断->查询中断向量表->获取入口地址->跳转中断服务函数 中断函数不需要声明 通过EXTI线捕获EXTI线,并且去生成中断,然后调用中断服务函数(翻转led等电平,后清除中断标志位)(如果不清除中断标志位,则会一直产生中断) NVIC相关函数 HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) // IRQ(中断请求) 第一个参数用来指定中断源,第二个参数用来设置抢占优先级,第三个函数用来设置响应优先级。 该函数通过设置SCB_SHP寄存器和NVIC_IPRx寄存器实现功能 HAL_NVIC_EnableIRQ(IRQn_Type IRQn) 该函数用来在NVIC控制器中使能指定中断 HAL_NVIC_DisableIRQ(IRQn_Type IRQn) 在NVIC控制器中禁用指定中断 HAL_NVIC_SystemReset(void) 用来初始化一个MCU复位要求 __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) //这里传入的参数是引脚号!!! 用来清除中断标志位,在响应中断后,执行句柄的函数,执行完后要清除中断标志位 遇到问题 1、出现identifier “GPIO_InitTypeDef” is undefine错误,可以通过添加“#include“stm32f1xx.h”来解决 2、st-link下载的程序,断开st-link链接电脑的u***口后无法正常运行: 需要把连在板子上的那头也断开,否则无法正常运行 3、使用三个按钮来触发中断,跳转到与蜂鸣器(KEY1控制)有关的中断函数并在执行完毕后可以正常跳转到主函数继续执行,但是另外两个与led等有关的中断服务函数(KEY_UP和KEY0控制)后,无法正常跳出(是清除中断标志位失效)。 在HAL_GPIO_EXTI_Callback 里面编写中断服务函数的所需实现的代码逻辑 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
569浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 23:15 , Processed in 0.998140 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号