实验是使用寄存器点亮LED
main.c代码
#include "stm32f4xx.h"
void delay(volatile uint32_t n)
{
for(;n!=0;n--);
}
int main(void)
{
//第一步:打开时钟
RCC_AHB1ENR|=(1<<5);
//第二步:配置引脚模式
GPIOF_MODER &=~(0b11<<(9*2));//首先,清零
GPIOF_MODER |=((1)<<(9*2));//在进行配置,01:通用输出模式
//第三步:点灯
while(1){
GPIOF_ODR|=(1<<9);//置1,点灭
delay(0xfffff);
GPIOF_ODR&=~(1<<9);//清0,点亮
delay(0xfffff);
}
}
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void){}
头文件代码:
#ifndef __STM32FXX_H
#define __STM32FXX_H
#define uint32_t unsigned int
#define uint16_t unsigned short
/* 片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)
/* 总线基地址 */
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
/* 总线基地址 */
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
/*RCC 外设基地址 */
#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
/*RCC 的 AHB1 时钟使能寄存器地址, 强制转换成指针 */
#define RCC_AHB1ENR (*(unsigned int*)(RCC_BASE+0x30))
#define GPIOF_MODER *(unsigned int*)(GPIOF_BASE+0x00)
#define GPIOF_ODR *(unsigned int*)(GPIOF_BASE+0x14)
#endif /*__STM32FXX_H*/
使用的芯片是STM32F407ZGT6,keil版本是:μVision V5.30.0.0,汇编器的配置是
结果编译报错,具体如下:
网上的方法试过了,这个:Keil5编程error: #18: expected a “)“问题解决,但是没解决
于是我就试试使用升级编译器,使用Compiler6。
嘿,错误消失了,而且实验现象符合预期,太棒了!
回去看,用Compiler 5怎么就报错呢。我就把那一行注释掉了,结果错误就没了,那么肯定是这一行有问题。仔细分一下,把0b11用3代替,在编译错误就消失了
GPIOF_MODER &=~(3<<(9*2));//首先,清零