人若无名 便可潜心练剑.|

hazy1k

园龄:7个月粉丝:14关注:0

🔖CW32
2025-02-11 22:10阅读: 10评论: 0推荐: 0

第2章 寄存器点灯

第二章 寄存器点灯

1. 配置流程

  1. 打开端口时钟

  2. 配置端口功能

  3. 配置输出/输入模式

  4. 配置驱动能力或者速度

  5. 初始化端口

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 中国大陆许可协议进行许可。

posted @   hazy1k  阅读(10)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起