选用的是STM32F103ZET6这款芯片。
在磁盘上创建一个目录projects,在projects下创建工程目录led。
准备启动文件,start。标准外设库目录,找到我们需要的启动文件和其他核心文件copy到Start目录。
根据前面硬件电路设计,我们只要让GPIOA的0口输出低电平就行了。代码需要按照下面的步骤来实现。
1)开启时钟:
在stm32中,让I/O口工作必须先开启对应的时钟。根据手册找到对应的寄存器。
我们需要知道RCC_APB2ENR这个寄存器的地址:
知道RCC这个外设的基地址,然后加上这个寄存器的偏移地址就行了。
从上面可以看出来,RCC的基地址是0x4002 1000,APB2ENR的偏移量是0x18,所以APB2ENR的地址值是0x4002 1000 + 0x18。
有了地址,在这个地址写入一个数据,这个数据的二进制第2位是1就行了。其他位暂时不管。我们写入4。这样就开启了GPIOA的时钟。
在代码中,我们需要把地址强转成指针才能给这个地址赋值。
*(uint32_t *)(0x40021000 + 0x18) = 4;
2)给IO口设置输出模式
在STM32中,如果要让IO口输出低电平或高电平,必须给要使用的IO设置为输出模式。
根据前面的思路,需要先找到GPIOA的基地址,再根据偏移地址找到要使用的寄存器的地址。GPIOA的基地址是0x4001 0800。
配置PA0口的输出模式的寄存器是GPIOA_CRL。
配置成最大速度的推挽输出:
地址值是0x4001 0800 + 0x00。
*(uint32_t *)(0x40010800 + 0x00) = 3;
3)给PA0口输出0
给指定PA0口输出0就可以点亮LED1了。用到的寄存器是ODR数据输出寄存器。
ODR寄存器的地址是 0x40010800 + 0x0c 。给这个地址的第0位写0,其他位写1。
*(uint32_t *)((0x40010800 + 0x0c)) = 0xfffe;
具体代码:点亮三个灯。