精华内容
下载资源
问答
  • HC32F4A0SGTB-LQFP176芯片的在 地址 下载驱动库及样例-DDL 解压后 开发环境的配置 1、keil 环境搭建 keil 的版本要求5.11以上,尽量使用高版本。 下载keil 的IDE的支持包,HDSC.HC32F4A0.1.0.4.pack,直接安装

    开发环境的配置和资料获取

    资料获取

    进行HC32开发前先阅读华大提供的《MCU 开发工具用户手册》里面有相关事项的说明。

    • 驱动库获取
      前往华大半导体官方网站:官网 找到对应的芯片型号, 下载驱动库及样例。
      如HC32F4A0SGTB-LQFP176芯片的在
      地址

      在这里插入图片描述
      下载驱动库及样例-DDL
      解压后
      在这里插入图片描述

    开发环境的配置

    1、keil 环境搭建

    • keil 的版本要求5.11以上,尽量使用高版本。
    • 下载keil 的IDE的支持包,HDSC.HC32F4A0.1.0.4.pack,直接安装到相应的keil软件的路径下。(如果一台电脑中装多个keil可以再相应版本的的keil安装目录下xx\local\arm\)里面安装
      在这里插入图片描述
      安装后在pack installer中出现,HDSC的芯片证明安装成功,可以打开dll库中的例程开始编译。在这里插入图片描述
    展开全文
  • 华大汽车MCU手册
  • 一、开启FPU功能 点这个麻将牌四筒,展开CMSIS,把DSP勾了。 点开后 然后点这个锤子 No Auto Includes的勾不要打,让它自动...打开hc32f4a0.h文件,搜索__FPU_PRESENT,在宏定义处定义为1 至此FPU功能就开启完

    一、开启FPU功能

    点这个麻将牌四筒,展开CMSIS,把DSP勾了。
    在这里插入图片描述
    在这里插入图片描述
    点开后
    在这里插入图片描述

    然后点这个锤子在这里插入图片描述

    在这里插入图片描述
    No Auto Includes的勾不要打,让它自动include,因为CMSIS-DSP库在KEIL的安装目录中已经存在了,工程里面不需要另外添加这些库文件,自动include会帮你找到它们。

    在Target标签页选上这个Use Single Precision,有些版本上面显示的是use FPU
    在这里插入图片描述
    打开hc32f4a0.h文件,搜索__FPU_PRESENT,确定其在宏定义处定义为1
    在这里插入图片描述
    至此FPU功能就开启完毕了,我们可以使用官方库函数进行多种数学和信号运算,这些官方函数在实现这些高级运算时调用了FPU的指令,这样运算速度大幅提升!
    在这里插入图片描述

    当我们使用FFT时,需要引入两个头文件,由于允许Auto Includes,KEIL MDK会自动在它的安装目录里面找到它们

    #include "arm_math.h"
    #include "arm_const_structs.h"
    

    在这里插入图片描述

    二、使用库函数q15_t arm_sin_q15(q15_t x);生成正弦采样序列

    在使用外部信号源经AD采样获取真实信号继而FFT之前,我们先模拟一个正弦波采样序列来试验测试FFT功能。

    根据实际使用需求,我们模拟一个50hz的正弦信号,采样率为1600Hz,即每个周波32采样,共采样1024个点,每个点都使用Q15定点数 (-1 ~ 0.9999695)。

    Fs = 1600 Hz (采样率)
    N = 1024个点 (采样数)
    n = 0,1,2,… N-1 (采样点序列)
    t = 0,1/Fs,2/Fs,…(N-1)/Fs (采样时刻序列)
    x = sin(2π x 50 x t) (采样信号序列)

    #define TEST_LENGTH_SAMPLES 1024 
    static q15_t testInput_q15_50hz[TEST_LENGTH_SAMPLES];
    uint32_t fftSize = TEST_LENGTH_SAMPLES ; 
    uint32_t Fs = 1600; 
    

    数学上 y = sin(x) 的定义域是是(-∞,+∞),但是DSP库中的q15_t arm_sin_q15(q15_t x);的参数数值范围是[0,2^15),对应于弧度[0,2π)。

    所以我们需要按照每周波32采样的采样率通过取余运算适配这个定义域

    	for(uint16_t n=0; n<fftSize; n++)
    	{
    		j = n % 32;
     		testInput_q15_50hz[n] = arm_sin_q15(k*j);
    	}
        systickStart = SysTick->VAL;
    

    其中k为:

    	k = 32768 * 50 / Fs;
    

    这样我们就配置好了50Hz正弦波在1600Hz采样率下采集1024个点的信号采样序列。
    在这里插入图片描述

    三、Q15定点FFT运算

    参照DSP库函数说明

      /**
       * @brief Instance structure for the Q15 RFFT/RIFFT function.
       */
      typedef struct
      {
        uint32_t fftLenReal;                      /**< length of the real FFT. */
        uint8_t ifftFlagR;                        /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
        uint8_t bitReverseFlagR;                  /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
        uint32_t twidCoefRModifier;               /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
        q15_t *pTwiddleAReal;                     /**< points to the real twiddle factor table. */
        q15_t *pTwiddleBReal;                     /**< points to the imag twiddle factor table. */
        const arm_cfft_instance_q15 *pCfft;       /**< points to the complex FFT instance. */
      } arm_rfft_instance_q15;
    
      arm_status arm_rfft_init_q15(
      arm_rfft_instance_q15 * S,
      uint32_t fftLenReal,
      uint32_t ifftFlagR,
      uint32_t bitReverseFlag);
    
      void arm_rfft_q15(
      const arm_rfft_instance_q15 * S,
      q15_t * pSrc,
      q15_t * pDst);
    

    调用该函数运算FFT:

    	static q15_t testOutput_q15_50hz[TEST_LENGTH_SAMPLES];
    	arm_rfft_instance_q15 S;
    	uint32_t ifftFlag = 0; 
    	uint32_t doBitReverse = 1; 
    	/* 初始化结构体S */
     	(void)arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);
     	/* 实数FFT Q15运算 */
     	arm_rfft_q15(&S, testInput_q15_50hz, testOutput_q15_50hz);
    

    查阅资料得知其结果是Q5格式。

    安富莱电子

    根据公式x = (float)xq * 2-Q可以换算成浮点数

    	static float32_t testOutput_f32_50hz[TEST_LENGTH_SAMPLES];
    	for(uint16_t n = 0; n < fftSize; n++)
    	{
    		testOutput_f32_50hz[n] = (float32_t)testOutput_q15_50hz[n]/32;
    	}
    

    其运算结果为:
    在这里插入图片描述
    这是一个复数,偶数项为实部,其后的奇数项为虚部。这个复数为-0.03125-512j

    再调用DSP库函数计算其幅值,其实由于实部很小,估算可知其幅值为512。

    	static float32_t testOutput[TEST_LENGTH_SAMPLES];
     	arm_cmplx_mag_f32(testOutput_f32_50hz, testOutput, fftSize); 
    

    求得其结果为:
    在这里插入图片描述
    由于本例是1600hz采样1024点,所以FFT后其频域响应在32 * 1600 / 1024 = 50Hz处出现极大值。
    幅值计算公式为:An * 2 / N,即512 * 2 / 1024 = 1。
    即得到正弦频率为50Hz,增益为1。结果与输入信号的相符。

    四、实数Q15 1024FFT的运行时间

    HC32F4AO主频设在200MHz,使用Systick记录Q15 1024FFT加上转换为浮点数最后算得幅值的总时间。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    运行耗时在900us左右。再分开查看
    在这里插入图片描述
    FFT耗时565us,1024个Q5定点复数转成浮点型耗时85us,算幅值耗时203us。这段时间内应该发生了几次中断,所以实际的耗时应该要比它更短。

    由于实际需求中不一定需要关注全频域的幅频响应,所以算幅值的203us可以得到相当的节省。

    展开全文
  • OV2643 datasheet
  • 华大单片机HC32F4A0产品特性: ARM Cortex-M4 32bit MCU+FPU,300DMIPS,2MB Flash,516KB SRAM,2USBs (HS/FS OTG),Ethernet MAC,2CANs(FD/2.0B),2SDIOs,DVP,EXMC,32 Timers,16HRPWMs,3ADCs,4DACs,4...

    华大单片机HC32F4A0产品特性:
    ARM Cortex-M4 32bit MCU+FPU,300DMIPS,2MB Flash,516KB SRAM,2USBs (HS/FS OTG),Ethernet
    MAC,2CANs(FD/2.0B),2SDIOs,DVP,EXMC,32 Timers,16HRPWMs,3ADCs,4DACs,4PGAs,
    4 CMPs,10UARTs,6SPIs,6I2Cs,4I2Ss,QSPI,AES,HASH(SHA256/HMAC),FMAC(FIR),MAU

    ⚫ ARMv7-M 架构 32bit Cortex-M4 CPU,集成FPU、MPU,支持 SIMD 指令的 DSP,全指令跟踪单元 ETM,及 CoreSight 标准调试单元。工作主频 240MHz,达到 300DMIPS 或825Coremarks 的运算性能.
    ⚫华大单片机 HC32F4A0内置存储器

    2MBKByte 的 dual bank Flash memory

    516KByte 的 SRAM,包括 128KByte 的单周期访问高速 RAM
    ⚫ 华大单片机HC32F4A0电源,时钟,复位管理

    系统电源(Vcc):1.8-3.6V

    6 个独立时钟源:外部主时钟晶振(4- 24MHz),外部副晶振(32.768kHz),内部高速 RC(16/20MHz),内部中速 RC(8MHz),内部低速 RC(32kHz),内部 WDT 专用 RC(10kHz)

    包括上电复位(POR),低电压检测复位(PVD1R/PVD2R),端口复位(NRST)在内的 15 种复位源,每个复位源有独立标志位
    ⚫华大单片机 HC32F4A0低功耗运行

    外设功能可以独立关闭或开启

    三种低功耗模式:Sleep,Stop,Power down
    模式

    VBAT 独立供电支持超低功耗 RTC,128Byte备份寄存器,4KByte 备份 SRAM
    ⚫ 外设运行支持系统显著降低 CPU 处理负荷

    16 通道双主机 DMAC

    USBHS,USBFS,Ethernet MAC 专用 DMAC

    8 个数据计算单元(DCU)

    数学协处理单元(MAU),支持 Sin/Sqrt

    支持 16 阶 FIR 数字滤波器(FMAC)

    支持外设事件相互触发(AOS)
    ⚫ 华大单片机HC32F4A0高性能模拟

    3 个独立 12bit 2.5MSPS ADC

    3 个同时采样保持电路实现 3 通道同时采样

    4 个独立 12bit 15MSPS DAC

    4 个可编程增益放大器(PGA)

    4 个独立电压比较器(CMP)

    1 个片上温度传感器(OTS)
    ⚫ Timer

    8 个多功能 32/16bit PWM Timer(Timer6)

    16 个 50ps 高分辨率 PWM(HRPWM)

    3 个 16bit 电机 PWM Timer(Timer4)

    12 个 16bit 通用 Timer(TimerA)

    4 个 16bit 通用 Timer(Timer2)

    2 个 16bit 基础 Timer(Timer0)

    实时时钟 Timer(RTC)

    2 个 WDT,支持内部专用时钟
    ⚫ 142 个 GPIO

    134 个 5V-tolerant IO
    ⚫ 32 个通信接口

    10 个 USART,支持 ISO7816-3 协议

    6 个 SPI

    6 个 I2C,支持 SMBus 协议

    4 个 I2S,内置音频 PLL

    2 个 SDIO,支持 SD/MMC/eMMC 格式

    1 个 QSPI,支持 240Mbps 高速访问(XIP)

    2 个 CAN,支持 CAN2.0B,支持 CAN FD

    2 个 USB 2.0,分别支持 HS,FS,内置 FS
    PHY,支持 Device/Host

    1 个 10/100M Ethernet MAC,支持专用 DMA,
    IEEE 1588-2018 PTP,MII/RMII 接口
    ⚫ 外部存储器控制器 EXMC

    支持静态 Memory 控制器

    支持动态 Memory 控制器
    ⚫ 数据加密功能

    AES/HASH(SHA256/HMAC)/TRNG
    ⚫ 华大单片机HC32F4A0封装形式:
    LQFP176(24×24mm)
    LQFP144(20×20mm)
    LQFP100(14×14mm)
    VFBGA176(10×10mm)
    TFBGA208(13×13mm)

    展开全文
  • 一、启动时钟 PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR6_x, Enable);...以上步骤类似STM32的开启RCC时钟。 二、功能初始化 设置TIM62的GCONR寄存器。 /* Timer6 general count function configuration

    一、启动时钟

    PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR6_x, Enable);
    

    TMR6对应FCG2,根据PWM输入引脚来确定是TMR6_x(本例为TMR6_2)。运行以后PWC的FCG2寄存器相应位被清0。
    在这里插入图片描述

    同时TM62的这些寄存器被全部置1,GCONR的DIR位被置一。
    在这里插入图片描述
    以上步骤类似STM32的开启RCC时钟。

    二、功能初始化

    设置TIM62的GCONR寄存器。
    在这里插入图片描述
    在这里插入图片描述

        /* Timer6 general count function configuration */
        stcTIM6BaseCntCfg.u32CntMode = TMR6_MODE_SAWTOOTH;
        stcTIM6BaseCntCfg.u32CntDir = TMR6_CNT_INCREASE;
        stcTIM6BaseCntCfg.u32CntClkDiv = TMR6_CLK_PCLK0_DIV1024;
        stcTIM6BaseCntCfg.u32CntStpAftOvf = TMR6_CNT_CONTINUOUS;
        (void)TMR6_Init(M4_TMR6_2, &stcTIM6BaseCntCfg);
    

    设为锯齿波(TMR6_MODE_SAWTOOTH),计数增长(TMR6_CNT_INCREASE),1024分频(TMR6_CLK_PCLK0_DIV1024),计满溢出后继续计数(TMR6_CNT_CONTINUOUS)。
    在这里插入图片描述

    三、配置GPIO为PWM输入

    本例为PB07
    PB07可以作为TIM62_PWM的A通道使用
    在这里插入图片描述

    #define         TMR6_2_PWMA_PORT       (GPIO_PORT_B)
    #define         TMR6_2_PWMA_PIN        (GPIO_PIN_07)
    GPIO_SetFunc(TMR6_2_PWMA_PORT, TMR6_2_PWMA_PIN, GPIO_FUNC_3_TIM62_PWMA, PIN_SUBFUNC_DISABLE);
    

    在这里插入图片描述

    四、确立TMR62定时周期

        /* Period register set */
        u32Period = 0xFFFFFFFFu;
        TMR6_SetPeriodReg(M4_TMR6_2, TMR6_PERIOD_REG_A, u32Period);
    

    TMR62是32位计数器最大值可以设置到0xFFFFFFFF。对PERAR寄存器设置0xFFFFFFFF。PERBR和PERCR可以作为缓存,这里不用,不管它们。

    五、开启外部PWM信号捕获并配置滤波

    设定端口控制寄存器PCNAR(PCNBR)的 CAPMDA(CAPMDB)位为1,捕获输入功能变为有效,同时设置FCNGR的对应A或B开启滤波,并配置其时钟分频。本例使用channel A。

        /* Capture input port configuration */
        stcTIM6PortInCfg.u32PortMode = TMR6_PORT_CAPTURE_INPUT;
        stcTIM6PortInCfg.u32FilterSta = TMR6_PORT_INPUT_FILTER_ON;
        stcTIM6PortInCfg.u32FltClk = TMR6_INPUT_FILTER_PCLK0_DIV16;
        (void)TMR6_PortInputConfig(M4_TMR6_2,TMR6_IO_PWMA, &stcTIM6PortInCfg);
    

    在这里插入图片描述
    在滤波采样基准时钟采样到端口上 3 次一致的电平时,该电平被当作有效电平传送到模块内部;小于 3 次一致的电平会被当作外部干扰滤掉,不传送到模块内部。其动作。在这里插入图片描述
    在这里插入图片描述

    六、配置PWM捕获(HCPAR)

    这个库函数是专门配置通道A的,操作寄存器HCPAR。

        TMR6_HwCaptureChACondCmd(M4_TMR6_2, TMR6_HW_CTRL_PWMA_RISING, Enable);
    

    请注意,如果需要使用通道B,则需要换函数。

    void TMR6_HwCaptureChBCondCmd(M4_TMR6_TypeDef *TMR6x,
                                uint32_t u32CondSrc,
                                en_functional_state_t enNewState)
    

    在这里插入图片描述
    在这里插入图片描述

    七、捕获到跳变沿后,计数器计数硬件清零(HCLRR)

    配置硬件清零事件选择寄存器(HCLRR),使得每次发生捕获事件后,计数器从0开始重新计数。

    如果想测量PWM周期,则应该与捕获条件一致,本例捕获为上升沿,所以清0条件也应为上升沿。

        TMR6_HwClrCondCmd(M4_TMR6_2, TMR6_HW_CTRL_PWMA_RISING, Enable);
    

    在这里插入图片描述

        TMR6_HwClrFuncCmd(M4_TMR6_2, Enable);
    

    在这里插入图片描述
    在这里插入图片描述

    八、配置中断(ICONR,发生捕获时触发)

    启动捕获功能时,每当发生捕获事件,当前的计数值就被保存到相应的捕获寄存器(GCMAR、GCMBR)中,本例使用GCMAR。我们开启ICONR寄存器中的最低位。

        /* Enable M4_TMR6_2 GCMAR interrupt */
        TMR6_IntCmd(M4_TMR6_2, TMR6_IRQ_EN_CNT_MATCH_A, Enable);
    

    在这里插入图片描述

    这样就可以在发生捕获时触发中断。
    到这里总结一下,当外部上升沿进来时,TMR62会直接产生:

    1. 产生捕获事件
    2. 计数器清零0

    进而由于产生捕获事件间接产生:

    1. 触发中断

    九、配置中断向量及回调函数(NVIC)

    STM32F4的中断向量通道和对应功能是固定死的,而HC32F4A0的非常灵活,可以自由配置。不过使用STM32的标准库函数来配NVIC非常方便,所以移植了STM32F4的misc.c文件,来对HC32F4A0进行NVIC配置。移植的时候需要修改以下几处:

    1.misc.h
    在这里插入图片描述
    在这里插入图片描述
    2. misc.c

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    然后即可使用misc文件里面的函数来配置NVIC了。

    /**因为HC32F4A0的中断向量通道与中断源以及相应的中断服务函数可以灵活映射,所以需要手动配置**/
    	stcIrqRegiConf.enIRQn = Int003_IRQn;                    /* Register INT_TMR6_2_GCMA Int to Vect.No.003 */
        stcIrqRegiConf.enIntSrc = INT_TMR6_2_GCMA;              /* Select Event interrupt of M4_TMR6_2 */
        stcIrqRegiConf.pfnCallback = &Tmr6_2_CapInputCallBack;  /* Callback function */
        (void)INTC_IrqSignIn(&stcIrqRegiConf);  
        
    /**后面就使用移植过来的misc文件中的库函数来配置NVIC了,注意ENABLE要改为Enable,其它跟STM32一样了**/
    	NVIC_InitTypeDef NVIC_InitStructure;
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	
    	NVIC_InitStructure.NVIC_IRQChannel = Int003_IRQn;      
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;		
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			
        NVIC_InitStructure.NVIC_IRQChannelCmd = Enable;
        NVIC_Init(&NVIC_InitStructure);
    

    在这里插入图片描述

    Intxxx_IRQn可选择为Int000_IRQn ~ Int031_IRQn,以及Int056_IRQn ~ Int061_IRQn。

    展开全文
  • 四、DMA配置 一、开启时钟,设置触发源 华大半导体的HC32F4A0和国内惯用的STM32F4xx相比,其中一个显著的设计区别是HC32F4A0有一个AOS外设,用于硬件之间的联动。详见用户手册第11章及相关章节。 本例涉及到的ADC和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,280
精华内容 512
关键字:

hc32f4a0