
这节课需要做到的事情是点亮电路板上的LED灯首先做到点亮第一个LED灯stm32开发板stm32开发板上有很多很多的一个电流接口每一个接口都需要负责对应的部分你需要先开启对应的接口他才会供应电流有了电流他才能给每一个接口进行供电就像一道道关卡只有先通过第一关第二关的大门才会打开开始点亮以上是电路板的LED组件电流回路是从左侧阳极输出高电压那么右边的引脚就需要输出低电压只有两者形成一个电压差才有可能形成一个电路回路点亮LED灯如果右边也输出一个高电压的话两边一样电压就像一个池子里边的水两边相等就不会产生任何的高视差自然也就不会产生电流连接在LED_R右边的叫做引脚我们要做的是通过右边的引脚去进行输出电流让电流流出来或者流进去而嵌入式板子就可以控制电流跟电压的高低在这块板子当中他已经给我们封装好了地址我们需要做的是通过访问他的地址把电流进行输出的一个操作要点亮这个LED灯我们需要用到一个GPIO库他就相当于管控开关的可以进行输入输出电流的电压但是他还有许多其他的功能这个边学边看首先我们需要点亮红灯他接的是PF6的引脚那么我们需要去找到PF6引脚的一个初始地址因为gpio分为很多的端口而我们要做的是接入pf6的端口那么根据对应的字母我们应该要找GPIOF的起始地址可以看到起始地址是0x4002 1400接下来需要在这个起始地址的基础上找到PF6的一个地址改成输出模式才能输出电流由于我们要点亮的是PF6所以找到ODR6他是起始地址向左偏移6位但是一开始的引脚都是输入模式所以我们需要找到端口模式寄存器把引脚改成输出模式我们要用到的是输出引脚PF6那么就需要把PF6这个端口改成输出模式也就是把原本的默认复位模式00改成01所以需要在初始地址上边向左移12位因为GPIOF的基础地址是0x40021400所以需要再在这个基础上0x00偏移到这个端口模式寄存器的地址修改里边的值所以语句是*unsigned int *(0x400214000x00)(12*6)但是不可以这么写因为这么写的话虽然那一个位置是被替换掉了但是其他的会全部变成0因为是直接赋值覆盖因为寄存器是32位的那么赋值的话就是相当于00000000000000000001然后1左移了其他的还是0所以直接这样子写不对位与规则对应位同时为 1结果才是 1任意一位是 0结果就是 0或与规则只要任意一位是 1结果就是 1*unsigned int *(0x400214000x00)~(12*6)*unsigned int *(0x400214000x00)|(12*6)只有先执行取反操作然后在进行或与值才2不会被改变如果没有这么做的话其他引脚的值就会变成不是原来引脚的值了在将引脚换成01之后就需要进行控制引脚进行输出低电平那么需要偏移到ODR6这个地址控制他输出低电平所以是要把这个位置变成0其余引脚不变*unsigned int *(0x400214000x14)~(16)但是在做完这些之后还不会亮因为时钟还没开启也就是说那个3v的地方还没有电流现在需要把对应时钟的端口给他打开因为GPIOF挂载在AHB1总线上所以要使用RCC因为所有外设时钟、复位都由RCC统一进行管理RCC的话就需要向左偏移5个地址把这个地址设置为1要找到时钟的起始地址RCC的起始地址是23800而AHB1的偏移地址是0x30*(unsigned int *) (0x400238000x30)|(15)下边为程序参考#include stm32f4xx.hvoid Delay(unsigned int i){for(;i!0;i--){}};int main(void){/*打开时钟寄存器*/*(unsigned int *) (0x400238000x30) | ( 15 ); //首先需要打开时钟配置器给出一定的电流才能够操作输出成低电平点亮LED灯//首先开启GPIOF为输出配置接着才能输出低电平产生电势差才可以有电流//GPIOF配置为输出*(unsigned int *) (0x400214000x00) ~( (0x03) (2*8) ); //0x03代表的二进制是11接着让他偏移12位取反成00其他的是1//然后就会跟之前没有修改的值进行一个位与的操作因为原本的是0所以在改变其他的之后其他的并没有原本就是1故之后还是为0但是改的那个地方的值已经是0了所以在做了操作之后还是00*(unsigned int *) (0x400214000x00) | ( 1 (2*8) );//偏移了地址取1之后因为是位或操作所以只要后边有一个是任何数他就可以变成另一个数*(unsigned int *) (0x400214000x00) ~( (0x03) (2*7) );*(unsigned int *) (0x400214000x00) | ( 1 (2*7) );*(unsigned int *) (0x400214000x00) ~( (0x03) (2*6) );*(unsigned int *) (0x400214000x00) | ( 1 (2*6) );///*PF6输出高电平*/////*( unsigned int *) (0x400214000x14)| (18); //将1偏移6位原本是0的就全部是0,然后这个修改之后的值会跟之前没有修改的值进行一个或的操作////PF6输出低电平//*(unsigned int *) (0x400214000x14) ~(16); //将1偏移6位// *(unsigned int *) (0x400214000x14) ~(17);// *(unsigned int *) (0x400214000x14) ~(18);while(1){LED_B | (18);Delay(10000000);LED_B ~(18);Delay(10000000);LED_G ~(17);Delay(10000000);LED_G| (17);Delay(10000000);*(unsigned int *) (0x400214000x14) ~(16);Delay(10000000);*( unsigned int *) (0x400214000x14)| (16);Delay(10000000);}}void SystemInit(){/*这个函数为空因为原来调用的库函数里边没有实现这个函数写这个函数是为了骗过编译器不报错误*/}//作业把其他灯也点亮//实现三个灯闪烁时间的控制使用软件延时