STMCUBE-MX HAL库的学习之GPIO操作

/ 0评 / 1

STM32CUBEMX生成的都是HAL库,与以前传统的库不一样,导致很多人说不会用,太难用.但是这其实很好用啊,包括中间层什么都做了,虽然实际项目中经常有方案变更搞到好费劲...
QQ截图20160113114152
他的所有例子都在stm32cubef4STM32Cube_FW_F4_V1.10.0ProjectsSTM32F429I-DiscoveryExamples (举例我的开发板,其他也会有,如果用自己的板子还是比较麻烦,为何不买一个官方的先实验.),我这次用一个GPIO的例子.里面用到的东西由一个CHM文件描述.比如我的是STM32F439xx_User_Manual.chm啊.里面是怎么实现的,请不要深究,不然就怎么都搞不好了.除非以后还想怎么优化时间那个.
打开GPIO例子,发现好简单的Main函数.
QQ截图20160113114639
比如我们看chm格式的那个文档,看看HAL_Init是干什么的.而不是直接看他里面代码.
QQ截图20160113115233

这个功能用于初始化HAL库,它必须是main函数的第一个指令,如图就是这样的,它执行以下操作:配置Flash预取,指令和数据缓存,就是我们说的很高端的什么ICACHE,DCACHE,配置SysTick产生一个1毫秒周期中断,它的时钟为HSI,不过,在这一阶段,时钟还没有被配置,因此系统从内部恒指运行在16兆赫),设置NVIC组优先级为4... 好了,这么多废话,就是初始化底层嘛.然后下面就容易理解了,都是以前的东西,EXTILine0_Config配置一个EXIT0中断,说白了,就是PA0中断.包括函数HAL_NVIC_SetPriority其实就是NVIC_SetPriority的变形.但是中断处理逻辑就稍微复杂了一点点了.一样是先进入EXTI0_IRQHandler,然后执行HAL_GPIO_EXTI_IRQHandler,再执行HAL_GPIO_EXTI_Callback,虽然是这样,层层包裹只是为了规范,这是...这样真的好吗?
好了,我们试过他的Demo,我们自己也可以生成一个,用到以下资源.第一步先给PA0一个EXIT0的属性.
QQ截图20160113132448
给PG13输出的功能,他连接着LED.
QQ截图20160113132518
时钟跳过不配置,就跑16MHz.这时候还要设置NVIC属性,把下面高亮的EXIT0打勾.
QQ截图20160113133603
生成一个工程,发现生成的工程也是非常简洁.
QQ截图20160113142715
然后还有MX_GPIO_Init进行GPIO的逻辑配置.用到的函数也很熟悉,然后编译,发现也成功了,但是中断里面还没写啊.是的,因为他以weak声明了一个,所以,我们应该在主函数声明一个真正的CallBack.
QQ截图20160113144215
真正的CallBack写法如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_0)
  {
    /* Toggle LED3 */
    HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_13);
  }
}

编译再下载,整个工程就可以用了.再按键,看得到效果啦,就是这么方便.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注