一.调用的函数:
- 在stm32f429中点亮led通过控制引脚的高低电平来实现,在f429的hal库中控制引脚高低电平的函数:
void HAL_GPIO_WritePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);*
使用样例(引脚PB1输出低电平):
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
(RESET: 输出低电平 ; SET:输出高电平)
二.涉及到的寄存器
-
stm32f429中通过IDR寄存器来接收GPIO口的输入电平:
-
通过ODR寄存器来控制GPIO口的输出电平:
该寄存器用于设置某个 IO 输出低电平(ODRy=0)还是高电平(ODRy=1),该寄存器也仅在输出模式下有效。
举例:如果我要使得PB2口输出高电平(即:ODR2=1),其余口为低电平:
ODR寄存器16位可以表示成:0000 0000 0000 0100(赋值即:0x04);
则代码可以写成:GPIOB->ODR=0x04; -
BSRR寄存器
寄存器 BSRR,它叫 置位/复位寄存器。该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。
BSRR寄存器是个32位的寄存器,它分为高16位和低16位。
对于低16位即 BSy[15:0]:当被写为“1”时,对应引脚输出高电平; 写“0”时,无影响。
对于高16位即 BRy[31:16]:当被写为“1”时,对应引脚输出低电平; 写“0”时,无影响。
举例:如果我要使得PB2口输出高电平,再使其输出低电平,而其余口为低电平:
则代码可以写成:
GPIOB->BSRR=0x04; ---------------------------- // PB2口输出高电平
GPIOB->BSRR=0x04<<16;---------------------- // PB2口输出低电平
“<<”时c语言中的位移运算符。
附上代码
- 主函数是使用HAL库函数实现控制IO口输出:
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
LED_Init(); //初始化LED
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //LED0对应引脚PB1拉低,亮,等同于LED0(0),PBout(0)=0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //LED1对应引脚PB0拉高,灭,等同于LED1(1),PBout(1)=1
delay_ms(500); //延时500ms
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //LED0对应引脚PB1拉高,灭,等同于LED0(1),PBout(0)=1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //LED1对应引脚PB0拉低,亮,等同于LED1(0),PBout(1)=0
delay_ms(500); //延时500ms
}
}
- 下面主函数使用直接操作寄存器方式实现跑马灯
//GPIOA->BSRR低16位某位为“1”,则对应的IO端口引脚置“1”;
//GPIOA->BSRR高16位某位为“1”,则对应的IO端口引脚置“0”;
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
LED_Init(); //初始化LED
while(1)
{
GPIOB->BSRR=0x02; //LED0亮
GPIOB->BSRR=0x01<<16; //LED1灭
delay_ms(500);
GPIOB->BSRR=0x02<<16; //LED0灭
GPIOB->BSRR=0x01; //LED1亮
delay_ms(500);
}
}