本帖最后由 love2008 于 2023-8-29 10:12 编辑
HC32L196PCTA测评
开箱如图
拆开包装
产品特点
⚫ 48MHz Cortex-M0+ 32 位 CPU 平台 ⚫ HC32F190/HC32F196 系列具有灵活的功耗管理系统,低功耗性能– 3μA @3V深度休眠模式 所有时钟关闭,上电复位有效, IO状态保持, IO中断有效,所有寄存器、 RAM和 CPU 数据保存状态时的功耗– 10μA @32.768KHz低速工作模式CPU运行,外设关闭,从 Flash运行程序– 30μA/MHz@3V@24MHz休眠模式CPU停止,外设关闭,主时钟运行 – 130μA/MHz@3V@24MHz工作模式CPU运行,外设关闭,从 Flash运行程序 – 4μs唤醒时间 使模式切换更加灵活高效,系统反应更为敏捷 ⚫ 256K字节 Flash存储器,具有擦写保护功能 支持 ISP、 ICP、 IAP ⚫ 32K字节 RAM存储器,附带奇偶校验,增强系统的稳定性 ⚫ 通用 I/O 引脚( 88IO/100PIN, 72IO/80PIN 56IO/64PIN, 40IO/48PIN, 26IO/32PIN ⚫ 时钟、晶振 – 外部高速晶振 4 ~ 32MHz – 外部低速晶振 32.768KHz – 内部高速时钟 4/8/16/22.12/24MHz – 内部低速时钟 32.8/38.4KHz – PLL时钟 8 ~ 48MHz – 硬件支持内外时钟校准和监控 ⚫ 定时器 /计数器 – 3个 1通道互补 输出 通用 16位定时器 – 1个 3通道互补输出 通用 16位定时器 – 3个高性能 16位定时器 /计数器,支持PWM 互补,死区保护功能 – 1个可编程 16位定时器 PCA,支持 5通道捕获比较, 5通道 PWM输出 – 1个 20位可编程看门狗电路,内建专用 10KHz振荡器提供 WDT 计数 ⚫ 通讯接口 – 4路 UART标准通讯接口 – 2路 SPI标准通讯接口 – 2路 I2C标准通讯接口 ⚫ 蜂鸣器频率发生器,支持互补输出 ⚫ 硬件 CRC16 / CRC32 模块 ⚫ AES-128/192/256 硬件协处理器 ⚫ TRNG 真随机数发生器 ⚫ 2通道 DMAC ⚫ 4*52 / 6*50 / 8*48 LCD驱动 ⚫ 全球唯一 10字节 ID 号 ⚫ 12位 1Msps采样的高速高精度 SARADC内置跟随器,可测量高输出阻抗的信号 ⚫ 1路 12位 500Ksps DAC ⚫ 集成 1个多功能运算放大器 可以作为DAC的输出 Buffer ⚫ 集成 3路电压比较器,具有 6位 DAC和可编程比较基准 ⚫ 集成低电压侦测器,可配置 16阶比较电压 ,可监控端口电压以及电源电压 ⚫ SWD 调试解决方案,提供全功能调试器 ⚫ 工作条件 ::-40 ~ 1.8 ~ 5.5V ⚫ 封装形式: LQFP100/80/64/48, QFN32
各种资源丰富,我主要用于户外电源的BMS以及面板控制和逆变的前驱控制.
测试官方例程:
/**
******************************************************************************
** \brief 主函数
**
** @param 无
** \retval 无
**
******************************************************************************/
int32_t main(void)
{
Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE); ///< 使能RCL时钟
Sysctrl_SetRCLTrim(SysctrlRclFreq32768); ///< 配置内部低速时钟频率为32.768kHz
Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE); ///< 开启LCD时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); ///< 开启GPIO时钟
App_PortCfg(); ///< LCD端口配置
App_LcdCfg(); ///< LCD模块配置
Lcd_ClearDisp(); ///< 清屏
Lcd_WriteRam(0,0x0f0f0f0f); ///< 赋值寄存器LCDRAM0
Lcd_WriteRam(1,0x0f0f0f0f); ///< 赋值寄存器LCDRAM1
while(1)
{
;
}
}
en_result_t Sysctrl_ClkSourceEnable(en_sysctrl_clk_source_t enSource, boolean_t bFlag)
{
en_result_t enRet = Ok;
uint32_t u32Temp;
_SysctrlUnlock();
bFlag = !!bFlag;
u32Temp = M0P_SYSCTRL->PERI_CLKEN0;
switch (enSource)
{
case SysctrlClkRCH:
M0P_SYSCTRL->SYSCTRL0_f.RCH_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->RCH_CR_f.STABLE))
{
;
}
break;
case SysctrlClkXTH:
M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = TRUE;
M0P_GPIO->PFADS |= 3u;
M0P_SYSCTRL->SYSCTRL0_f.XTH_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->XTH_CR_f.STABLE))
{
;
}
break;
case SysctrlClkRCL:
M0P_SYSCTRL->SYSCTRL0_f.RCL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->RCL_CR_f.STABLE))
{
;
}
break;
case SysctrlClkXTL:
M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = TRUE;
M0P_GPIO->PCADS |= 0xC000;
M0P_SYSCTRL->SYSCTRL0_f.XTL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->XTL_CR_f.STABLE))
{
;
}
break;
case SysctrlClkPLL:
M0P_SYSCTRL->PERI_CLKEN0_f.ADC = TRUE;
M0P_BGR->CR_f.BGR_EN = TRUE;
delay10us(20);
M0P_SYSCTRL->SYSCTRL0_f.PLL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->PLL_CR_f.STABLE))
{
;
}
break;
default:
enRet = ErrorInvalidParameter;
break;
}
M0P_SYSCTRL->PERI_CLKEN0 = u32Temp;
return enRet;
}
/**
******************************************************************************
** \brief 初始化外部GPIO引脚
**
** \return 无
******************************************************************************/
void App_PortCfg(void)
{
Gpio_SetAnalogMode(GpioPortA, GpioPin9); //COM0
Gpio_SetAnalogMode(GpioPortA, GpioPin10); //COM1
Gpio_SetAnalogMode(GpioPortA, GpioPin11); //COM2
Gpio_SetAnalogMode(GpioPortA, GpioPin12); //COM3
Gpio_SetAnalogMode(GpioPortA, GpioPin8); //SEG0
Gpio_SetAnalogMode(GpioPortC, GpioPin9); //SEG1
Gpio_SetAnalogMode(GpioPortC, GpioPin8); //SEG2
Gpio_SetAnalogMode(GpioPortC, GpioPin7); //SEG3
Gpio_SetAnalogMode(GpioPortC, GpioPin6); //SEG4
Gpio_SetAnalogMode(GpioPortB, GpioPin15); //SEG5
Gpio_SetAnalogMode(GpioPortB, GpioPin14); //SEG6
Gpio_SetAnalogMode(GpioPortB, GpioPin13); //SEG7
Gpio_SetAnalogMode(GpioPortB, GpioPin3); //VLCDH
Gpio_SetAnalogMode(GpioPortB, GpioPin4); //VLCD3
Gpio_SetAnalogMode(GpioPortB, GpioPin5); //VLCD2
Gpio_SetAnalogMode(GpioPortB, GpioPin6); //VLCD1
}
/**
******************************************************************************
** \brief 配置LCD
**
** \return 无
******************************************************************************/
void App_LcdCfg(void)
{
stc_lcd_cfg_t LcdInitStruct;
stc_lcd_segcom_t LcdSegCom;
LcdSegCom.u32Seg0_31 = 0xffffff00; ///< 配置LCD_POEN0寄存器 开启SEG0~SEG7
LcdSegCom.stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xffffffff; ///< 初始化LCD_POEN1寄存器 全部关闭输出端口
LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0; ///< 使能COM0~COM3
LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Mux = 0; ///< Mux=0,Seg32_35=0,BSEL=1表示:选择外部电容工作模式,内部电阻断路
LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Seg32_35 = 0;
Lcd_SetSegCom(&LcdSegCom); ///< LCD COMSEG端口配置
LcdInitStruct.LcdBiasSrc = LcdExtCap; ///< 电容分压模式,需要外部电路配合
LcdInitStruct.LcdDuty = LcdDuty4; ///< 1/4duty
LcdInitStruct.LcdBias = LcdBias3; ///< 1/3 BIAS
LcdInitStruct.LcdCpClk = LcdClk2k; ///< 电压泵时钟频率选择2kHz
LcdInitStruct.LcdScanClk = LcdClk128hz; ///< LCD扫描频率选择128Hz
LcdInitStruct.LcdMode = LcdMode0; ///< 选择模式0
LcdInitStruct.LcdClkSrc = LcdRCL; ///< LCD时钟选择RCL
LcdInitStruct.LcdEn = LcdEnable; ///< 使能LCD模块
Lcd_Init(&LcdInitStruct);
}
测试结果: 全屏显示8.8:8.8
插上MicroUsb,板子Led2 呼吸灯,板子自带CMSIS_DAP,方便开发调试
准备移植RTT系统.
初步移植OK...下一步创建2个任务
与STM32F0xx的脚位是pin to pin 的,完全可以替代,资源比ST的还要丰富,值得一用..
|