比如我要读 GPIOA.5 的电平状态,那么方法是:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现
的:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该寄存器通过举例子可以很清楚了解它的使用方法。例如你要设置 GPIOA 的第 1 个端口
值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:
GPIOA->BSRR=1<<1;
如果你要设置 GPIOA 的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可:
GPIOA->BSRR=1<<(16+1)
在 STM32 固件库中,通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数
GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
虽然 IO 操作步骤很简单,这里我们还是做个概括性
的总结,操作步骤为:
1) 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。
2) 初始化 IO 参数。调用函数 GPIO_Init();
3) 操作 IO。操作 IO 的方法就是上面我们讲解的方法。
在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。
1<<i是把1左移i位,每次左移以为就是乘以2,所以1<<i的结果是1乘以2的i次方
i<<1就是把i左移一位,即i乘以2,假如i=5,最后结果就是5*2=10
左边是需要计算的数,右边是需要移动的位数。
位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
#ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。
GPIO_InitTypedef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
u8 是 unsigned char
u16 是 unsigned short
u32 是 unsigned int
u8,u16,u32都是unsigned char类型,不过u8是一个字节的,u16 是2字节,u32是4字节
XXXX_InitTypedef XXXX_InitStructure是对某个结构体的申明
例如
GPIO_InitTypedef GPIO_InitStructure;
GPIO_Init(GPIOA,&GPIO_InitStructure);
优先级数字越小优先级越高,同理等同于响应优先级
组 AIRCR[10:8] bit[7:4]分配情况 分配结果
0 111 0:4 0 位抢占优先级,4 位响应优先级
1 110 1:3 1 位抢占优先级,3 位响应优先级
2 101 2:2 2 位抢占优先级,2 位响应优先级
3 100 3:1 3 位抢占优先级,1 位响应优先级
4 011 4:0 4 位抢占优先级,0 位响应优先级
不支持连续按,扫描某个按键,该按键按下之后,必须要松开,才能第二次触发,
否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,
而坏处就是在需要长按的时候比较不合适。
支持连续按,如果某个按键一直按下,则会一直
返回这个按键的键值,这样可以方便的实现长按检测。
串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能,GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数
1. 串口时钟 使能。 。串口是挂载在 APB2 下面的外设,所以使能函数为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
2. 串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置
这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外
设的操作。复位的是在函数 USART_DeInit()中完成:
void USART_DeInit(USART_TypeDef* USARTx);//串口复位
比如我们要复位串口 1,方法为:
USART_DeInit(USART1); //复位串口 1
3. 串口 参数初始化。串口初始化是通过 USART_Init()函数实现的,
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。
第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用
来设置串口的一些参数。一般的实现格式为:
USART_InitStructure.USART_BaudRate = bound; //波特率设置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
define 是 C 语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供
方便。常见的格式:
#define 标识符 字符串
“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:
#define SYSCLK_FREQ_72MHz 72000000
定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000。
网友评论