第2章 寄存器点灯
第二章 寄存器点灯
1. 配置流程
-
打开端口时钟
-
配置端口功能
-
配置输出/输入模式
-
配置驱动能力或者速度
-
初始化端口
2. 开启GPIO的端口时钟
CW32的所有外设资源时钟默认都是关闭的,在配置外设之前需要先开 启对应的时钟。 要使能用户LED,就要先开启GPIOC的时钟,从数据手册的第11页我们了解到GPIOC挂载在AHB总线上,那操作GPIOC的时钟肯定要配置AHB使能寄存器。在用户手册的第81页,SYSCTRL_AHBEN 使能寄存器如下图。
从上图可以看到地址偏移量为0x30,那这个基地址是多少呢?在用户手册的第68页有明确说明,SYSCTRL 基地址:0x4001 0000 。那我们SYSCTRL_AHBEN 寄存器的地址就是基地址加上偏移量,0x4001 0000 + 0x30 = 0x4001 0030。 我们已经找到地址了,根据上图我们可以清晰的看到GPIOC的位域是6,我们只需要在第六位域将这个位赋值为1即可!!
*(unsigned int *)(0x40010030) |= (1 << 6); // 使能GPIOC时钟
3. 配置GPIO数字功能
我们首先来查看寄存器列表(在用户手册第151页):
有几个点我们需要特别注意:
- 查看GPIOC的基地址
- 寄存器名称
- 寄存器描述
找到GPIOx_ANALOG寄存器,将13引脚对应的位配置为0,将端口配置为数字模式(只有高低电平)
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- GPIOx_ANALOG寄存器地址是:0x4800 0800 + 0x1C
- 将该寄存器的地址中的第13位域写入0即可。
*(unsigned int *)(0x4800081C) &= ~(1 << 13); // PC13设定为数字模式
4. 配置输出模式
在GPIOx_DIR寄存器地址中将13引脚对应的位配置为0,将端口配置为输出。
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- GPIOx_DIR寄存器地址是:0x4800 0800 + 0x00 将该寄存器的地址中的第13位域写入0即可。
*(unsigned int *)(0x48000800) &= ~(1 << 13); // PC13设定为输出模式
在PIOX_OPENDRAIN寄存器地址中将13引脚对应的位配置为0,将端口配置为推挽输出。
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- GPIOx_OPENDRAIN寄存器地址是:0x4800 0800 + 0x04
将该寄存器的地址中的第13位域写入0即可。
*(unsigned int *)(0x48000804) &= ~(1 << 13); // PC13设定为推挽输出
5. 配置端口驱动能力和输出速度
在 PIOx_DRIVER寄存器 和 GPIOx_SPEED寄存器 将13引脚对应的位配置,将端口配置为高驱动里高速输出。
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- PIOx_DRIVER寄存器地址是:0x4800 0800 + 0x20
- GPIOx_SPEED寄存器地址是:0x4800 0800 + 0x08
PIOx_DRIVER的地址中的第13位域写入0即可。
PIOx_SPEED的地址中的第13位域写入1即可。
*(unsigned int *)(0x48000820) &= ~(1 << 13); // PC13设定为高驱动能力
*(unsigned int *)(0x48000808) |= (1 << 13); // PC13设定为高输出速度
6. 配置GPIO输出高电平
配置GPIO的输出需要配置端口输出寄存器GPIOx_ODR
从寄存器列表中我们可以知道:
- GPIOC基地址是:0x4800 0800
- PIOx_ODR寄存器地址是:0x4800 0800 + 0x54
- PIOx_DRIVER的地址中的第13位域写入0即可。
PIOx_SPEED的地址中的第13位域写入1即可。
*(unsigned int*)(0x48000854) |= (1 << 13); // PC13输出高电平
7. 测试代码
#include "main.h"
int main(void)
{
*(uint16_t*)(0x40010030) |= (1 << 6); // 使能GPIOC时钟
*(uint16_t*)(0x4800081c) &= ~(1 << 13); // PC13设定为数字模式
*(uint16_t*)(0x48000800) &= ~(1 << 13); // PC13设定为输出模式
*(uint16_t*)(0x48000804) &= ~(1 << 13); // 设置为推挽输出模式
*(uint16_t*)(0x48000820) &= ~(1 << 13); // 设置为高驱动能力
*(uint16_t*)(0x48000808) |= (1 << 13); // 设置为高输出模式
*(uint16_t*)(0x48000854) |= (1 << 13); // 设置为高电平
while(1);
}
本文作者:hazy1k
本文链接:https://www.cnblogs.com/hazy1k/p/18710573
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步