前言
之前学习过51,现在转学32,由于课题组需要,我需要尽量短的时间内掌握stm32的用法以及Freertos的操作系统。从现在开始记录所学,为了督促,为了回顾。
一、LED 点灯实验
首先,参考正点原子的代码,stm32在使用某个外设前都需要使能时钟,点灯需要调用最简单的GPIO外设来驱动,所以需要GPIO的始终使能。接下来再对GPIO的寄存器进行设置,调出来适合的IO口参数。
同样根据正点原子的例程,将以上内容写在外设专门的文件夹下管理,内容添加在led.c和led.h进去,以便调用。
#include"lcd.h"
#include"stm32f10x.h"
void lcd_init(void)
{
GPIO_InitTypeDef GPIO_str;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_str.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_str.GPIO_Pin = GPIO_Pin_0;
GPIO_str.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_str);
GPIO_Init(GPIOB,&GPIO_str);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
二、疑问记录
1.问题描述
对于GPIO初始化函数代码如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
我的理解和网上相反,我觉得第二个参数很好理解,就是一个结构体,结构体成员都需要初始化再使用,并且是以指针的类型输入。
但是我一开始对于第一个参数(GPIO_InitTypeDef*)一直不理解,不管是网上各种博客或者原子自己都是直接用GPIOX直接输入这个参数来选端口?但是这个参数类型是一个结构体指针类型,怎么就不需要和第二个参数一样初始化一个结构体呢(GPIO_TypeDef*)?
2.问题解决
一般我们对于第一个参数直接输入GPIOA或者GPIOB,当你在看GPIOA的defination时,库函数定义了如下宏定义,说明GPIOA就如同我们用51单片机里面的P1^0一样,是已经定义好地址的寄存器,所以可以直接调用,但是必须符合名称规范即GPIOX。
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
总结
因为初学,不知道一学习技巧和方法,如果有同学觉得有问题可以指出,努力啦!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)