前言 作为一个单片机老人,习惯于每拿到一个新单片机,第1时间是看规格书及使用手册。根据使用手册过一遍时钟分配、IO配置及UART,再装个PACK包,1个最简单的DEMO就可以跑了。所以本次为有相同习惯的同学提供一个寄存器配置的DEMO,前浪们轻拍,我们已经被拍在沙滩上了。 1、时钟配置 LKS32MC081的时钟系统是非常简单的,没有复杂的时钟树,只要简单配置几个寄存器即可使MCU工作在96MHz的时钟下。本次开发板没有外部HSE,所以仅以HSI作为PLL时钟源进行说明。MCU上电时默认使用4M HSI时钟,软件可以开启PLL时钟(SYS_AFE_REG5寄存器bit[15]),再选择PLL输出分频及选择PLL作为系统时钟即可(SYS_CLK_CFG寄存器)。PLL输出分频配置比较奇葩,如下图。具体代码参考sys_clk_init函数。 2、GPIO配置 LKS32MC081 GPIO部分与大部分的MCU都差不太多,熟悉STM32系的应该都很容易看明白,而且超赞的是IO口的复用功能都是固定的,不会像STM32系MCU那样每个IO的复用都不一样。不足之处就是没有下拉功能且上拉也不全,如下图。GPIO配置部分代码参考gpio_init函数。 3、UART配置 LKS32MC081 UART有点类似于51系等8位单片机,只有简单的UART功能。简单到只要打开外设时钟,再配置波特率寄存器配置一个波特率就行了。此部分代码参考usart_init函数。 4、独立看门狗配置 LKS32MC081也延续着简单的风格,只要配置SYS_WDT_CLR寄存器即可,但要注意此寄存器是写保护的,需要向SYS_WR_PROTECT寄存器写入0xCAFE才能开启写入。另外使能看门狗功能是在SYS_RST_CFG寄存器。具体代码参考iwdg_init函数及FEED_DOG()宏定义。 5、定时器配置 LKS32MC081有4个通用定时器,定时器0、1是16位的,2、3是32位的且有编码器功能。基本的配置就是在UTIMER_UNTx_CFG(x=0、1、2、3,下同)寄存器配置定时器时钟及定时器工作模式:基本定时器、输出比较、输入捕获;再配置UTIMER_UNTx_TH配置计数到此值重新从0开始计数,如果是输出比较,还需要配置UTIMER_UNTx_CMP0、UTIMER_UNTx_CMP0的比较匹配值,再配置中断及使定时器外设即可。 定时器2、3有编码器功能,有独立的寄存器,不影响定时器功能。使用编码器功能首先需要配置UTIMER_ECDn_CFG(n=0、1,下同)选择脉冲捕获模式再配置UTIMER_ECDn_TH的最大计数值,然后配置中断及使定时器外设即可。 具体代码参考timers_init函数。可使用有感无刷电机的3个霍尔信号的其中两个作为编码器的输入信号实验测试。 6、ADC配置 LKS32MC081 的ADC相对于其他外设来说功能是复杂一点,需要根据的具体的应用来灵活配置,如参考官方的FOC例程。但基本功能的配置也是比较简单的。基本功能代码参考adc_init及get_adc_val函数。 7、HALL传感器接口配置 LKS32MC081 有一个专用于接3相霍尔传感器的接口。可以配置滤波并且3个霍尔的值也直接捕获到寄存器里面了,不需要再去读IO口的状态,这个比STM32系的单片机可简单方便多了。具体代码参考hall_init函数。 8、MCPWM LKS32MC081 的MCPWM模块是电机PWM专用信号发生器。基本的配置: MCPWM_TCLK寄存器配置并使能模块时钟 在MCPWM_TH寄存器配置最大计数值,实际的计数值是此寄存器值的2倍,因为是从-MCPWM_TH计数到+MCPWM_TH的; MCPWM_THx0及MCPWM_THx1(x=0,1,2,3,下同)是配置与MCPWM_TH寄存器进行比较的比较匹配值,配置是比较灵活的,比如要配置输出50%占空比的PWM,则可以配置MCPWM_THx0的值为-MCPWM_TH到0,而MCPWM_THx1则可以配置为0到+MCPWM_TH; MCPWM_DTHx0及MCPWM_DTHx1是配置通道x的死区时间; MCPWM_IO01及MCPWM_IO23配置4个通道的输出极性; MCPWM_FAIL寄存器配置故障处理 具体代码参考mc_pwm_init函数
|