GPIO接口
作业
作业一:自己实现寄存器配置点亮LED1。
main.c文件
//1.使能系统时钟
// 系统时钟初始化 - 不加入会报错 可以尝试一下
void SystemInit(void)
{
//对地址 0xE000ED88 的内容 进行修改:
//将0X3向左移动20位 或上 0X3 向左移动22位
*(unsigned int*) 0xE000ED88|=((3UL << 20U)|(3UL << 22U));
}
int main()
{
//RCC_AHB2寄存器地址 = RCC的基地址+RCC_AHB2的偏移地址得到
//RCC_AHB2寄存器地址 = 0x5602 0C8C
//2.使能GPIO总线上的时钟
*(unsigned int *)0x56020C8C |=1<<2;
//3.配置GPIO相关寄存器
//GPIO_MODER位27和位26分别为01 输出模式
*(unsigned int *)0x52020800 &=~(1<<27);
*(unsigned int *)0x52020800 |=1<<26;
//GPIO_OTYPER寄存器位13写入0
*(unsigned int *)0x52020804 &=~(1<<13);
//GPIO_OSPEEDR位27和位26写入00
*(unsigned int *)(0x52020800+0x08) &=~(1<<27);
*(unsigned int *)(0x52020800+0x08) &=~(1<<26);
//GPIO_ODR寄存器位13写入1 高电平
*(unsigned int *)(0x52020800+0x14) |=(1<<13);
return 0;
}
6、作业二:寄存器配置打开风扇,打开蜂鸣器。
打开风扇main.c文件
// 系统时钟初始化 - 不加入会报错 可以尝试一下
void SystemInit(void)
{
//对地址 0xE000ED88 的内容 进行修改:
//将0X3向左移动20位 或上 0X3 向左移动22位
*(unsigned int*) 0xE000ED88|=((3UL << 20U)|(3UL << 22U));
}
int main()
{
//RCC_AHB2寄存器地址 = RCC的基地址+RCC_AHB2的偏移地址得到
//RCC_AHB2寄存器地址 = 0x5602 0C8C
//2.使能GPIO总线上的时钟
*(unsigned int *)0x56020C8C |=1<<2;
//3.配置GPIO相关寄存器
//GPIO_MODER位13和位12分别为01 输出模式
*(unsigned int *)0x52020800 &=~(1<<13);
*(unsigned int *)0x52020800 |=1<<12;
//GPIO_OTYPER寄存器位13写入0
*(unsigned int *)(0x52020800+0x04) &=~(1<<6);
//GPIO_OSPEEDR位13和位12写入00
*(unsigned int *)(0x52020800+0x08) &=~(1<<13);
*(unsigned int *)(0x52020800+0x08) &=~(1<<12);
//GPIO_ODR寄存器位6写入1 高电平
*(unsigned int *)(0x52020800+0x14) |=(1<<6);
return 0;
}
蜂鸣器main.c代码
// 系统时钟初始化 - 不加入会报错 可以尝试一下
void SystemInit(void)
{
//对地址 0xE000ED88 的内容 进行修改:
//将0X3向左移动20位 或上 0X3 向左移动22位
*(unsigned int*) 0xE000ED88|=((3UL << 20U)|(3UL << 22U));
}
int main()
{
//RCC_AHB2寄存器地址 = RCC的基地址+RCC_AHB2的偏移地址得到
//RCC_AHB2寄存器地址 = 0x5602 0C8C
//2.使能GPIO总线上的时钟
*(unsigned int *)0x56020C8C |=1<<2;
//3.配置GPIO相关寄存器
//GPIO_MODER位31和位30分别为01 输出模式
*(unsigned int *)0x52020800 &=~(1<<31);
*(unsigned int *)0x52020800 |=1<<30;
//GPIO_OTYPER寄存器位15写入0
*(unsigned int *)(0x52020800+0x04) &=~(1<<15);
//GPIO_OSPEEDR位31和位30写入00
*(unsigned int *)(0x52020800+0x08) &=~(1<<31);
*(unsigned int *)(0x52020800+0x08) &=~(1<<30);
//GPIO_ODR寄存器15位写入1 高电平
*(unsigned int *)(0x52020800+0x14) |=(1<<15);
return 0;
}
思维导图