--------------拿到一个工程模板,首先要编译,编译成功之后再删除main()内容,这样编译不会出错。-----------------
**
程序步骤
**
配置时钟使能寄存器
RCC AHB1ENR寄存器 用来时钟使能,然后 跑马灯IO口是PF9,PF10 ,GPIOF在RCC AHB1ENR 中是第五位, 给它写入1,其他位保持不变,所以要进行 “或运算”
RCC->AHB1ENR|= 1<<5;//把这个寄存器的第五位设置为1
配置PF9
MODER寄存器
F0是 0,1位 F1是2,3位,,,所以 F9 是18,19位, 给该位写入 01输出模式
a,首先要把这两位清零,在与01进行“或运算” (ps 不清零要写入01有些麻烦)
b,清零:比如把 11 10 10 11 -------->11 10 01 11,,,要把第二位(最右边为最低位) 10 清零 需要
11 10 10 11 & 11 11 00 11 (这里有个技巧,可以这样想 将与上的这个数变为
00 00 11 00 再取反)11 10 10 11 & (~(00 00 11 00))
而00 00 11 00 可以写成( 3<<2)因为11是3, 原来是这个数00 00 00 11,将11左移两位,就变成了 00 00 11 00.
c, 清零后 就变成了 11 10 00 11,再进行或运算给第二位 写入 01 ,把1<<2.
OSPEEDR寄存器
PUPDR
OTYPER寄存器
每一位配置一个IO,0 推挽 0<<9(推挽 可以输出 01电平,开漏只能输出0电平)
ODR寄存器给高电平 写入1(或运算),给低电平写入0(与运算)
GPIOF->ODR|= 1<<9;//1 高电平
GPIOF->ODR&=~(1<<9);//0 低电平
//PF9
GPIOF->MODER &= ~(3<<2*9);//设置第九个IO口,每一个IO操作两个位,3是11,清零
GPIOF->MODER |= 1<<(2*9);//1是01 ,写入01 输出模式
GPIOF->OSPEEDR &= ~(3<<2*9);
GPIOF->OSPEEDR |= 2<<(2*9); //写入 10 配置50MHz
GPIOF->PUPDR &= ~(3<<2*9);
GPIOF->PUPDR |=1<<(2*9);//上拉
GPIOF->OTYPER &= ~(1<<9);
GPIOF->OTYPER |=0<<9;//推挽
GPIOF->ODR|= 1<<9;//1 高电平
//PF10-
GPIOF->MODER &= ~(3<<2*10);
GPIOF->MODER |= 1<<(2*10);
GPIOF->OSPEEDR &= ~(3<<2*10);
GPIOF->OSPEEDR |= 2<<(2*10);
GPIOF->PUPDR &= ~(3<<2*10);
GPIOF->PUPDR |=1<<(2*10);
GPIOF->OTYPER &= ~(1<<10);
GPIOF->OTYPER |=0<<10;
GPIOF->ODR|= 1<<10;
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init(168);
LED_Init();
while(1){
GPIOF->ODR&=~(1<<9);
GPIOF->ODR&=~(1<<10);
delay_ms(500);
GPIOF->ODR |= 1<<9;
GPIOF->ODR |=1<<10;
delay_ms(500);
}
}
上一篇:常用的推挽输出、开漏输出、上拉输入
下一篇:第一个跑马灯实验