文章目录

  • 芯片简介
  • 开发环境
  • Cortex-M0+内核
  • 基本功能开发
    • gpio配置
    • 外部中断
    • 时钟配置
    • 基本定时器
    • 延时函数
  • 特殊管脚配置
  • 休眠模式
  • 看门狗

芯片简介

开发环境

使用Keil作为开发IDE。
第一次使用需要安装HDSC的Device支持包。可以通过Pack Installer安装或从HDSC官网下载Device支持包,拷贝到keil源目录。
安装后,创建工程时,选择MCU型号一栏选择HDSC系列可见,表示可以安装环境正常。

Cortex-M0+内核

华大HC32F005系列单片机采用了Cortex-M0+的内核。
Cortex-M0+内核内置了嵌套向量中断控制器(NVIC),参考内核的头文件(安装路径下D:\Keil_v5\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\Include)

/** \brief  Enable External Interrupt */
void NVIC_EnableIRQ(IRQn_Type IRQn);/** \brief  Disable External Interrupt */
void NVIC_DisableIRQ(IRQn_Type IRQn);/** \brief  Get Pending Interrupt */
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);/** \brief  Set Pending Interrupt */
void NVIC_SetPendingIRQ(IRQn_Type IRQn);/** \brief  Clear Pending Interrupt */
void NVIC_ClearPendingIRQ(IRQn_Type IRQn);/** \brief  Set Interrupt Priority */
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);/** \brief  Get Interrupt Priority */
uint32_t NVIC_GetPriority(IRQn_Type IRQn);/** \brief  System Reset */
void NVIC_SystemReset(void);/*@} end of CMSIS_Core_NVICFunctions */

通过以上Cortex-M0+提供的中断操作接口来配置系统中断。

基本功能开发

gpio配置

/*********************************************************************************** \brief   GPIO 初始化2 ** ** \param   [in]  u8Port             IO Port口** \param   [in]  u8Pin              IO Pin脚** \param   [in]  enDir              IO 方向(输入或输出)** \param   [in]  bPullup            上拉开关** \param   [in]  bPulldown          下拉开关** \param   [in]  bOdr               开漏开关** \param   [in]  bDrive             驱动能力 **                                   0 = 高**                                   1 = 低** \retval     Ok         设置成功**             其他值     设置失败******************************************************************************/
en_result_t Gpio_InitIOExt(uint8_t u8Port, uint8_t u8Pin,en_gpio_dir_t enDir,boolean_t bPullup,boolean_t bPulldown,boolean_t bOdr,boolean_t bDrive);

根据实际使用要求配置成上拉、下拉、开漏、驱动能力模式。
无特殊要求的gpio可以简化配置:

en_result_t Gpio_InitIO(uint8_t u8Port, uint8_t u8Pin, en_gpio_dir_t enDir);

外部中断

外部中断配置流程:

void Gpio_IRQHandler(uint8_t u8Param)
{if (Gpio_GetIrqStat(WL_WAKEUP_GPIO, WL_WAKEUP_GPIO_Pin) == 1) {Gpio_ClearIrq(WL_WAKEUP_GPIO, WL_WAKEUP_GPIO_Pin);}
}void gpio_config(void)
{Gpio_Init(GPIO, GPIO_Pin, GpioDirIn);// clear irq flagGpio_ClearIrq(GPIO, GPIO_Pin);// enable irqGpio_EnableIrq(GPIO, GPIO_Pin, GpioIrqFalling);EnableNvic(PORT0_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE);
}void gpio_deinit(void)
{Gpio_DisableIrq(GPIO, GPIO_Pin, GpioIrqRising);Gpio_ClearIrq(GPIO, GPIO_Pin);
}

时钟配置

HC32F005芯片支持内部高速时钟(4M、8M、16M、24M)可配,低速时钟32.8K。
时钟初始化流程如下所示:

void clk_init(void)
{stc_clk_config_t stcCfg;/* set system freq */Clk_SetRCHFreq(ClkFreq16Mhz);/* CLK config */DDL_ZERO_STRUCT(stcCfg);stcCfg.enClkSrc = ClkRCH;   // RCH  = 16MstcCfg.enHClkDiv = ClkDiv1; // HCLK = 16M/1stcCfg.enPClkDiv = ClkDiv1; // PCLK = 16M/1/1Clk_Enable(ClkRCL, TRUE);Clk_Enable(ClkRCH, TRUE);Clk_Init(&stcCfg);/* open peripheral clk */Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE);Clk_SetPeripheralGate(ClkPeripheralBt, TRUE);Clk_SetPeripheralGate(ClkPeripheralWdt,TRUE);
}

基本定时器

Timer0/1/2可以作为三个16位自动重载或32位无重载定时器/计数器使用。
例如,需要配置100us间隔定时器,参考代码:

void timer_irq_handler(void)
{if (Bt_GetIntFlag(TIM0)) {Bt_ClearIntFlag(TIM0);}
}void timer_init(void)
{stc_bt_config_t stcConfig;uint16_t u16ArrData = (0xffff - 0x190);uint16_t u16InitCntData = 0xC000;/* (0xffff - x) * y = 100us * 16M */stcConfig.enGateP = BtPositive;stcConfig.enGate = BtGateDisable;stcConfig.enPRS = BtPCLKDiv4;stcConfig.enTog = BtTogDisable;stcConfig.enCT = BtTimer;stcConfig.enMD = BtMode2;stcConfig.pfnTim0Cb = timer_irq_handler;Bt_Init(TIM0, &stcConfig);// TIM1 enable interruptBt_ClearIntFlag(TIM0);Bt_EnableIrq(TIM0);EnableNvic(TIM0_IRQn, 3, TRUE);// set load value and calc valueBt_ARRSet(TIM0, u16ArrData);Bt_Cnt16Set(TIM0, u16InitCntData);Bt_Run(TIM0);
}

延时函数

官方历程库ddl.c中提供了一组延时函数:

void delay1ms(uint32_t u32Cnt);
void delay100us(uint32_t u32Cnt);

这组函数使用轮询的方式来做延时,对于需要精确延时的场景不能满足要求。
可以采用通用的定时器方式来实现,参考如下:

static uint16_t timer_timeout = 0;void timer_irq_handler(void)
{if (Bt_GetIntFlag(TIM0)) {Bt_ClearIntFlag(TIM0);/* 100us timer */if (timer_timeout != 0) {timer_timeout--;}}
}void sleep_100us(unsigned short usec)
{timer_timeout = usec;while(timer_timeout != 0);
}

特殊管脚配置

  • RESET管脚复用
    RESET管脚默认作为复位输入端口,低有效;
    RESET管脚复用成普通IO口使用时,只支持输入模式;
    启动后需要配置管脚复用:Clk_SetFunc(ClkFuncRstPinIOEn, TRUE);
  • SWD管脚复用
    SWD管脚复用成普通IO口使用时,无法进入调试模式;
    启动后需要配置管脚复用:Clk_SetFunc(ClkFuncSwdPinIOEn, TRUE);
    如果需要通过SWD烧录程序,那么在设备上电后,最好延时2-3s,预留烧录初始化的时间再配置复用。否则设置了复用后会导致无法使用SWD功能。

休眠模式

进入休眠前可以配置休眠模式,可选:

  • 深度睡眠(5uA@3V)
  • 低速模式深度睡眠(10uA@32.768KHz)
  • 浅度睡眠三种模式(30uA/MHz@3V)

进入休眠的代码:__WFI();
在休眠模式下,可以使用外部中断触发唤醒设备,需要在设备休眠前配置使能中断。

看门狗

该型号HC32F005系列的看门狗,支持设置看门狗超时重启和超时进中断两种模式;
缺陷:开门狗一旦开启,无法关闭或停止;
特殊使用场景下需要做特殊处理,例如:需要设备在运行和休眠模式切换时,进入休眠前无法关闭看门狗。此处处理方法为:

  1. 设置看门狗中断,不使能看门狗重启;
  2. 在看门狗中断中根据使用场景来选择重启设备。
    重启设备的代码:NVIC_SystemReset();

华大HC32F005单片机开发相关推荐

  1. 单片机开发工程师需要学哪些,单片机工作的基本条件

    记得刚毕业的时候,同学们都很迷茫,不知道自己以后要做什么工作. 有部分同学向社会低头,做了本专业,每天累死累活干的像条狗,10年过去了每天也才拿着上万块出头的工资. 也有一部分人选择为自己而活,去做自 ...

  2. c语言使单片机输出低电平,单片机开发中的一些实用技巧

    很多朋友正在学习单片机开发技术,但开发中免不了要碰到这样.那样的问题,有些问题可能无碍大局,但有一些问题却直接影响到产品的成本.体积.性能.这里介绍笔者的几个技巧,希望对大家的工作有帮助. 一.C语言 ...

  3. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  4. linux下51单片机开发解决方案

    上篇: 最近从学长那里淘到了一套单片机开发板,他给我的开发工具,驱动等都是 windwos 下的,而我一直用的是 linux--花了一个周末的时间,终于找到了一个合适的解决方案. 首先,我问了一下狗狗 ...

  5. 再搞75块单片机开发板!

    大家好,我是张巧龙,还记得当初自己用51开发板点亮了第一颗LED灯吗? 51单片机,yyds!不多说,直接抽奖送75块! 兴趣爱好 如果你对一件事失去了兴趣,我觉得你把这件事坚持做下去的概率很低. 反 ...

  6. 单片机开发与Linux开发有何不同?

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 针对ARM-Linux程序的开发,主要分为三类:应用程序开发.驱动程序开发.系统内核 ...

  7. 在linux下也能进行51单片机开发吗?送你一份教程。

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 阅读文本大概需要 5 分钟. 0 写在前面 在liunx环境下,没有keil这种ID ...

  8. mega2560单片机开发_[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)

    mega2560单片机开发 通过介绍世界上最受欢迎的编程语言之一掌握Java编程概念 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了一个极端的报价 . 我们提供的< Ultim ...

  9. linux的驱动开发——基于linux的单片机开发简介

    1.基于linux的单片机开发和裸机开发的区别 \qquad单片机的裸机开发和基于linux的单片机开发,是有这本质的不同. \qquad单片机的裸机开发更加底层,它是直接对寄存器进行操作,进而实现单 ...

最新文章

  1. python计算特征的统计值并文本输出
  2. 深入剖析Java即时编译器(上)
  3. random模块——生成伪随机数
  4. CMAKE_C_COMPILER not set
  5. 限制用户不允许输入中文字符
  6. 说说成为顶级运营人员的一个先决条件:做事的霸气!
  7. C语言 指针在函数传参中的使用
  8. 交换机的特点及工作原理
  9. “全宇宙首个”用中文编写的操作系统,作者还自创了甲、乙、丙编程语言?
  10. 告别鼠标——【Windows下常见系统快捷键】
  11. php storm 安装,PhpStorm安装教程
  12. excel一列求和_Excel六层心法
  13. 如何对研发团队绩效进行考核--附各环节人员考核参考表
  14. 磁盘读写的时间花费和调度算法(操作系统)
  15. already opened by ClassLoader
  16. 求关系模式的候选码的方法
  17. helm模板开发-流程控制、作用域、循环
  18. http://jackwang1.blog.163.com/blog/static/39534478201182651610201/
  19. 自媒体推广应该怎么入手,如何去做
  20. Specification 参数的用法

热门文章

  1. SQL对数据进行按月统计,或对数据进行按星期统计
  2. 权威专业,金山词霸2010牛津版全新上市!
  3. 什么是JavaFX?
  4. vue elemtui导出合并后的表格为excel
  5. Unity项目托管平台PlasticSCM(学习使用1)
  6. 凌度A958 行车记录仪 root 破解
  7. 原生 javascript ajax 实例演示
  8. 数据库-当前读与快照读
  9. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
  10. 微信支付-关联商户号申请提交后-解决未授权