打印

GD MCU 例子分析

[复制链接]
574|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
int main(void)
{   
    /* configure systick */
    systick_config();
   
    /* configure LEDs */
    led_config();
   
    /* configure USART */
    gd_eval_com_init(EVAL_COM1);

    printf("I2C-24C02 configured....\n\r");
   
    /* configure GPIO */
    gpio_config();
   
    /* configure I2C */
    i2c_config();
   
    /* initialize EEPROM */
    i2c_eeprom_init();

    printf("\r\nThe I2C0 is hardware interface ");
    printf("\r\nThe speed is %d", I2C0_SPEED);
   
    if(I2C_OK == i2c_24c02_test()){
        while(1){
           /* turn off all LEDs */
           gd_eval_led_off(LED1);
           gd_eval_led_off(LED2);
           gd_eval_led_off(LED3);
           gd_eval_led_off(LED4);
           /* turn on a LED */
           led_turn_on(count%4);
           count++;
           if(count >= 4){
               count = 0;
           }
           delay_1ms(500);
        }
    }
    /* turn on all LEDs */
    gd_eval_led_on(LED1);
    gd_eval_led_on(LED2);
    gd_eval_led_on(LED3);
    gd_eval_led_on(LED4);
   
    while(1);

}


使用特权

评论回复
沙发
过期的塔头|  楼主 | 2020-10-27 23:17 | 只看该作者
gpio_config();

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2020-10-27 23:18 | 只看该作者
void gpio_config(void)
{
    /* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* enable I2C0 clock */
    rcu_periph_clock_enable(RCU_I2C0);

    /* connect PB6 to I2C0_SCL */
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6);
    /* connect PB7 to I2C0_SDA */
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_7);
    /* configure GPIO pins of I2C0 */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
}

使用特权

评论回复
地板
过期的塔头|  楼主 | 2020-10-27 23:19 | 只看该作者
void rcu_periph_clock_enable(rcu_periph_enum periph)
{
    RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph));
}

使用特权

评论回复
5
过期的塔头|  楼主 | 2020-10-27 23:19 | 只看该作者
涉及到三个部分,1是 RCU_REG_VAL(periph),2是 BIT(RCU_BIT_POS(periph)),3是 参数 periph

使用特权

评论回复
6
过期的塔头|  楼主 | 2020-10-27 23:20 | 只看该作者
下面第一部分RCU_REG_VAL

使用特权

评论回复
7
过期的塔头|  楼主 | 2020-10-27 23:22 | 只看该作者
#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph)>>6)))

使用特权

评论回复
8
过期的塔头|  楼主 | 2020-10-27 23:25 | 只看该作者
/* bit operations */ #define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr))

使用特权

评论回复
9
过期的塔头|  楼主 | 2020-10-27 23:26 | 只看该作者
/* bit operations */ #define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr))

使用特权

评论回复
10
过期的塔头|  楼主 | 2020-10-27 23:27 | 只看该作者
/* RCU definitions */ #define RCU RCU_BASE

使用特权

评论回复
11
过期的塔头|  楼主 | 2020-10-27 23:29 | 只看该作者
#define RCU_BASE (AHB1_BUS_BASE + 0x00001000U) /*!< RCU base address */

使用特权

评论回复
12
过期的塔头|  楼主 | 2020-10-27 23:29 | 只看该作者
#define AHB1_BUS_BASE ((uint32_t)0x40020000U) /*!< ahb1 base address */

使用特权

评论回复
13
过期的塔头|  楼主 | 2020-10-27 23:32 | 只看该作者

使用特权

评论回复
14
过期的塔头|  楼主 | 2020-10-27 23:33 | 只看该作者
从Memory map中可以看到,AHB1_BUS_BASE的内存地址定义为了0x4002 0000,也合SEPC中介绍的一致;

使用特权

评论回复
15
过期的塔头|  楼主 | 2020-10-27 23:35 | 只看该作者
RUC的内存地址是RCU_BASE 也和SPEC上写的0x4002 1000对应

这里说一下,GD厂商给的SPEC中memory map是用内存地址来映射到硬件地址,

ARM是统一编址的,也就是外设和内存进行统一的编址,共同形成了4G物理地址空间(32位为例子)。

使用特权

评论回复
16
过期的塔头|  楼主 | 2020-10-27 23:36 | 只看该作者
大家知道操作外设时,实际上操作的是读写设备相关的寄存器,这些与外设相关的寄存器与不同操作模式下R0-R15那些寄存器是不同的,这些寄存器并不是所谓的物理上的寄存器,实际上是所谓的IO端口,通常会有控制、状态、数据的分类。他们被连续地编址,对于其编址的方式有两种一种是IO映射、一种是内存映射。IO映射是对x86为例的复杂指令集来说的,需要专门的IO控制指令,不详谈。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

968

帖子

0

粉丝