【单片机学习笔记】(19):F4和F1的异同、自定义库(知识补充、解决遇到的错误)、位带操作、软件仿真、外部中断

/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外设大致可分为两种功能:

  1. 捕获外部输入事件
  2. 生成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链接电脑的usb口后无法正常运行:

 需要把连在板子上的那头也断开,否则无法正常运行

3、使用三个按钮来触发中断,跳转到与蜂鸣器(KEY1控制)有关的中断函数并在执行完毕后可以正常跳转到主函数继续执行,但是另外两个与led等有关的中断服务函数(KEY_UP和KEY0控制)后,无法正常跳出(是清除中断标志位失效)

 

 

在HAL_GPIO_EXTI_Callback 里面编写中断服务函数的所需实现的代码逻辑

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值