1:基于STM32cubeMX实现GPIO,NVIC

1.gpio:

1.HAL_GPIO
一.引脚模式:
作为GPIO输入:
(1)输入浮空(Input floating),并且不使用上拉或下拉。
(2)输入上拉(Input pull-up),使用内部上拉电阻,引脚外部无输入时读取的引脚输入电平为高电平。
(3)输入下拉(Input pull-down),使用内部下拉电阻,引脚外部无输入时读取的引脚输入电平为低电平。
作为GPIO输出:
(4)具有上拉或下拉的开漏输出(Output open-drain)。如果没有上拉或下拉,开漏输出1时引脚是高阻态,输出0时引脚是低电平,这种模式可用于共用总线的信号。 
(5)具有上拉或下拉的推挽输出(Output push-pull)。如果没有上拉或下拉,推挽输出1时引脚为高电平,输出0时引脚为低电平。若需要增强引脚输出驱动能力,就可以使用上拉。
作为ADC或DAC引脚:
(6)模拟(Analog 功能),作为GPIO模拟引脚,用于
ADC输入或DAC输出引脚作为复用功能引脚
(7)具有上拉或下拉的复用功能推挽(Alternate function push-pull) 
(8)具有上拉或下拉的复用功能开漏(Alternate function open-drain)
二.HAL驱动程序
HAL_GPIO_Init() GPIO引脚初始化
HAL_GPIO_DeInit() 解除引脚的初始化,恢复为复位后的状态
HAL_GPIO_WritePin(GPIOA,GPIO_Pin_1,GPIO_PIN_SET) 使引脚输出0或1
HAL_GPIO_ReadPin() 读取引脚的输入电平
HAL_GPIO_TogglePin() 切换引脚的输出
HAL_GPIO_LockPin() 锁定引脚配置,而不是锁定引脚的输入或输出状态
三.文件gpio.c中的函数MX_GPIO_Init()的代码分析
(1) 使能端口时钟 __HAL_RCC_GPIOF_CLK_ENABLE();
(2) 设置LED两个引脚初始输出电平HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9|GPIO_PIN_10,GPIO_PIN_RESET);
(3)配置GPIO引脚: PF9 PF10 ,两个推挽输出的LED*/
 GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出模式
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

eg:1.新建工程:STM32CubeMx->File->New Project->选择芯片类型双击->点击某引脚,选择GPIO_Output:

 选择Project Manager:设置IDE为MDK-ARM及设置Project Name

 点击右上方GENERATE CODE生成代码,弹出框点击OPEN PROJECT打开配置的工程文件。这时引脚的模式,时钟已经配置好,在main.c文件中输入代码:(注意,自己加的代码需要放在CODE BEGIN和CODE END之间,否则再次使用CubeMX生成时会被删除)

 这时编译工程,烧写,此时PB14引脚不断反转,有LED则闪烁

 

2.中断

2.HAL_中断
NVIC采用4位二进制数设置中断优先级,分为抢占优先级(pre-emption priority)和次优先级(subpriority),优先级的数字越小表示优先级别越高。
优先级的执行有如下的规律: 
(1)如果两个中断的抢占优先级和次优先级都相同,哪个中断先发生就执行哪个中断的ISR。 
(2)高抢占优先级的中断可以打断正在执行的低抢占优先级的ISR的执行。
(3)抢占优先级相同时,次优先级高的中断不能打断正在执行的次优先级低的ISR函数的执行。
2.中断设置相关函数
HAL_NVIC_SetPriorityGrouping() 设置优先级分组方案
HAL_NVIC_SetPriority() 设置某个中断的抢占优先级和次优先级
HAL_NVIC_EnableIRQ() 启用某个中断
HAL_NVIC_DisableIRQ() 禁用某个中断
3.外部中断相关函数
__HAL_GPIO_EXTI_GET_IT() 检查某个外部中断线是否有挂起(Pending)的中断
__HAL_GPIO_EXTI_CLEAR_IT() 清除某个外部中断先的挂起标志位
__HAL_GPIO_EXTI_GENERATE_SWIT() 在某个外部中断线上产生软中断
__HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__)它的功能就是检查外部中断挂起寄存器(EXTI_PR)中某个中断线的挂起标志位知否置位
__HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__)在某个外部中断线上产生软中断
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 外部中断ISR函数中调用的通用处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 外部中断处理的回调函数,需要用户重新实现
4.使用步骤:
 1.在引脚界面配置引脚模式为GPIO_EXTIx
 2.NVIC中断使能,优先级不为0,因为SysTick优先级为0,会影响定时器,
 3.重写函数void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
   if (GPIO_Pin == KeyUp_Pin) 
     {-----}
     }
 4. 对函数HAL_GPIO_EXTI_IRQHandler()的代码改造。
在ISR函数HAL_GPIO_EXTI_IRQHandler中将清除中断挂起标志__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); 换到执行回调函数 HAL_GPIO_EXTI_Callback(GPIO_Pin)之后

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值