696|1

102

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[中微快充电压申请kit] 测评报告2: 点灯 [复制链接]

  本帖最后由 flyaqiao 于 2023-11-8 15:03 编辑

收到开发板已经有一段时间了,今天开始安装Keil环境,编写一个程序,什么程序呢,当然是嵌入界的Hello World,点灯啦

先看效果:

3930f3589d24da4f64828a43377bcac2

 

首先得安装芯片的开发环境了,安装过程如下:

1.下载官方软件包

https://bbs.eeworld.com.cn/elecplay.php?action=show&op=download&id=300&did=5

解压得到E:\CMS目录

 
 
选择刚才解压的目录

 

安装结果是在Keil的目录下:Pack\Cmsemicon\CMS32F0332\0.1.3
 

 

我们打开官方的DEMO,E:\CMS\Examples\Systick

这是一个利用Systick定时器做IO翻转的DEMO,我们在这个的基础上进行修改,实际LED1~LED5的跑马灯效果

参照原理图https://bbs.eeworld.com.cn/elecplay.php?action=show&op=download&id=300&did=1得知,

LED1~LED5对应的GPIO是:P06,P07,P26,P25,P24

修改main函数,对以上GPIO进行初始化

int main(void)
{
  SYS_DisableIOCFGProtect();      /*关闭IOCONFIG写保护*/
  SYS_DisableGPIO0Protect();      /*关闭GPIO0的相关寄存器写保护*/
  SYS_DisableGPIO1Protect();      /*关闭GPIO1的相关寄存器写保护*/
  SYS_DisableGPIO2Protect();      /*关闭GPIO2的相关寄存器写保护*/
  SYS_DisableGPIO3Protect();      /*关闭GPIO3的相关寄存器写保护*/
  SYS_DisableGPIO4Protect();      /*关闭GPIO4的相关寄存器写保护*/
  SYS_ConfigHSI(SYS_CLK_HSI_48M);   /*设置内部高速时钟为48Mhz*/
  SYS_EnableHSI();          /*开启高速时钟*/
  SYS_ConfigAHBClock(SYS_CLK_SEL_HSI, SYS_CLK_DIV_1); /*设置AHB时钟为高速时钟的1分频*/
  SYS_ConfigAPBClock(AHB_CLK_DIV_1);          /*设置APB时钟为AHB时钟的1分频*/
  SystemCoreClockUpdate();            /*刷新SystemCoreCLk、SystemAPBClock变量值*/
  SYS_SET_IOCFG(IOP06CFG, SYS_IOCFG_P06_GPIO);		// LED1配置
  SYS_SET_IOCFG(IOP07CFG, SYS_IOCFG_P07_GPIO);		// LED2配置
  SYS_SET_IOCFG(IOP26CFG, SYS_IOCFG_P26_GPIO);		// LED3配置
  SYS_SET_IOCFG(IOP25CFG, SYS_IOCFG_P25_GPIO);		// LED4配置
  SYS_SET_IOCFG(IOP24CFG, SYS_IOCFG_P24_GPIO);		// LED5配置
// 输出初始化
  GPIO0->DO_f.P6 = 0;
  GPIO0->DO_f.P7 = 0;
  GPIO2->DO_f.P6 = 0;
  GPIO2->DO_f.P5 = 0;
  GPIO2->DO_f.P4 = 0;
// 设置GPIO输出模式
  GPIO_CONFIG_IO_MODE(GPIO0, GPIO_PIN_6, GPIO_MODE_OUTPUT);
  GPIO_CONFIG_IO_MODE(GPIO0, GPIO_PIN_7, GPIO_MODE_OUTPUT);
  GPIO_CONFIG_IO_MODE(GPIO2, GPIO_PIN_6, GPIO_MODE_OUTPUT);
  GPIO_CONFIG_IO_MODE(GPIO2, GPIO_PIN_5, GPIO_MODE_OUTPUT);
  GPIO_CONFIG_IO_MODE(GPIO2, GPIO_PIN_4, GPIO_MODE_OUTPUT);
  Systick_Config();
  while (1) {}
}

然后修改SysTick的中断函数SysTick_Handler,在文件isr.c中

static int iSysTicks = 0;
// 翻转指定的LED
static void TriggerLed(int idx)
{
  switch (idx) {
  case 0:
    GPIO0->DO_f.P6 = ~GPIO0->DO_f.P6;
    break;
  case 1:
    GPIO0->DO_f.P7 = ~GPIO0->DO_f.P7;
    break;
  case 2:
    GPIO2->DO_f.P6 = ~GPIO2->DO_f.P6;
    break;
  case 3:
    GPIO2->DO_f.P5 = ~GPIO2->DO_f.P5;
    break;
  case 4:
    GPIO2->DO_f.P4 = ~GPIO2->DO_f.P4;
    break;
  }
}
void SysTick_Handler(void)
{
  iSysTicks++;
  if ((iSysTicks % 1000) == 0)
    TriggerLed((iSysTicks / 1000) % 5);
}

由初始化SysTick_Config(4800); /*100us*/得知,一次中断是100us,使用计数器iSysTIcks实现100ms翻转一个LED.以实现跑马灯效果

相关修改附在后面

demo_systick.c

3.25 KB, 下载次数: 0

demo_systick.h

2.82 KB, 下载次数: 0

isr.c

3.49 KB, 下载次数: 0

main.c

4.46 KB, 下载次数: 0

最新回复

看到他们封装的寄存器,有国产的影子,直接操作寄存器,效率比较高!  详情 回复 发表于 2023-11-9 17:30
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
看到他们封装的寄存器,有国产的影子,直接操作寄存器,效率比较高!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表