本帖最后由 尹小舟 于 2023-7-31 10:45 编辑
LKS32MC071时钟系统介绍
该芯片时钟系统包括内部 32KHz RC 时钟、内部 8MHz RC 时钟、外部 8MHz 晶体起振电路、PLL 电路组成
。
PLL 对 8M RC 时钟进行倍频,以提供给 MCU、ADC 等模块更高速的时钟。MCU 和 PWM 模块的最高时钟为 96
MHz,ADC 模块典型工作时钟为 48MHz,通过寄存器 ADCLKSEL<1:0>可设置为不同的 ADC 工作频率。
PLL 通过设置 PLLPDN=’1’打开(默认关闭,设 1 打开),开启 PLL 模块之前,同样也需要开启BGP(Bandgap)模块。
开启 PLL 之后,PLL 需要 6us 的稳定时间来输出稳定时钟。芯片上电的默认状态下,RCH 时钟和 BGP 模块都是开启的,但 PLL 默认是关闭的,需要软件来开启。
系统时钟可以通过SYS_CLK_CFG .CLK_SEL寄存器来选择,PLL输出的时钟也可以通过CLK_DIV改变
GPIO功能测试
内部无下拉,有上拉,数字信号经过一个三态门输出,输入通过一个与门进入芯片内部,模拟信号通
过一个约200Ω的电阻串联直接连接到PAD,数字信号经过一个三态门输出
#include "lks32mc07x_lib.h"
#include "hardware_init.h"
int main(void)
{
Hardware_init(); /* 硬件初始化 */
for (;;)
{
GPIO_SetBits(GPIO0, GPIO_Pin_6); /* LED1 亮*/
SoftDelay(0xFFFFF);
GPIO_ResetBits(GPIO0, GPIO_Pin_6); /* LED1 灭*/
SoftDelay(0xFFFFF);
}
}
void Hardware_init(void)
{
__disable_irq(); /* 关闭中断 中断总开关 */
SYS_WR_PROTECT = 0x7a83;
IWDG_DISABLE(); /* 关闭看门狗*/
GPIO_init(); /* GPIO初始化 */
SoftDelay(100); /* 延时等待硬件初始化稳定 */
__enable_irq(); /* 开启总中断 */
}
SYS_PROTECT 是写保护寄存器,写入 0x7A83,解除写保护,使能寄存器写操作,写入其它值,开启写保护,禁止寄存器写操作,读回恒为 0
void GPIO_init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
下载是使用的合宙的DAP
逻辑分析仪采集到GPIO翻转
定时器定时功能
#include "hardware_init.h"
void Hardware_init(void);
uint8_t Invers_GPIO(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
<p style="line-height: 30px; text-indent: 2em;">u16 reg;
reg = GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin); //读GPIO电平
if (reg)
{
GPIO_ResetBits(GPIOx, GPIO_Pin);
return 0;
}
else
{
GPIO_SetBits(GPIOx, GPIO_Pin);
return 1;
}</p>}
int main(void)
{
Hardware_init(); //硬件初始化
for(;;)
{
SoftDelay(100);
}
}
Invers_GPIO 是GPIO翻转函数
Invers_GPIO 函数要在interrupt.c文件中声明
extern uint8_t Invers_GPIO(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
void UTimer_init(void)
{
TIM_TimerInitTypeDefTIM_InitStruct;
TIM_TimerStrutInit(&TIM_InitStruct); / Timer结构体初始化/
TIM_InitStruct.Timer_TH = 48000; / 定时器计数门限初始值48000/
TIM_InitStruct.Timer_FLT = 0; / 设置捕捉模式或编码器模式下对应通道的数字滤波值 /
TIM_InitStruct.Timer_ClockDiv = TIMER_CLK_DIV1; / 设置Timer模块时钟2分频系数 /
TIM_InitStruct.Timer_IRQEna = Timer_IRQEna_ZC; / 开启Timer模块比较中断和过零中断/
TIM_TimerInit(UTIMER0, &TIM_InitStruct);
TIM_TimerCmd(UTIMER0, ENABLE); / Timer0 模块使能 */
}
void TIMER0_IRQHandler(void)
{
if(TIM_GetFlag(UTIMER0,TIMER_CH0_IF))
{
TIM_ClearIRQFlag(UTIMER0,TIMER_CH0_IF);
}
if(TIM_GetFlag(UTIMER0,TIMER_CH1_IF))
{
TIM_ClearIRQFlag(UTIMER0,TIMER_CH1_IF);
}
if(TIM_GetFlag(UTIMER0,TIMER_ZC_IF))
{
TIM_ClearIRQFlag(UTIMER0,TIMER_ZC_IF);
Invers_GPIO(GPIO0,GPIO_Pin_6);
}
}
|