21ic问答首页 - LKS32MC08x系列时钟主频、机器周期、总线周期、指令周期计算
LKS32MC08x系列时钟主频、机器周期、总线周期、指令周期计算
jiushao2023-05-13
1.在pll开启且不分频的条件下,用一个io口翻转电平的方式,在主循环内测试了一下输出频率,主循环内就一句代码:“GPIO0->PDO = ~GPIO0->PDO;”。得到的输出频率大概是2mhz,和预期值相差较大,所以询问一下如题。 2。以pwm方式触发ADC中断,在ADC中断中加入翻转gpio的测试。但是降低/提高pwm的频率对ADC中断中的电平翻转频率似乎没有影响?部分代码如下:
void ADC0_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_StructInit(&ADC_InitStructure); //初始化结构体
ADC_InitStructure.IE = ADC_EOS0_IRQ_EN | ADC_DAT0_OV_IRQ_EN; //第一段扫描结束中断使能和ADC_DAT0超阈值中断
ADC_InitStructure.Align = ADC_LEFT_ALIGN; //ADC数据输出左对齐
ADC_InitStructure.UTIMER_Trigger_En = DISABLE; //UTIMER_T0硬件触发ADC采样
ADC_InitStructure.MCPWM_Trigger_En = ADC_MCPWM_T0_TRG;
ADC_InitStructure.FirSeg_Ch = ADC_2_TIMES_SAMPLE; //第一段采样的总通道数: 1~20
ADC_InitStructure.Trigger_Cnt = 0; /*单段触发模式下触发一次采样所需要的事件数:0~15 0表示需要一次触发,15表示需要16次*///修改此处似乎进入中断的频率并没有更改?
ADC_InitStructure.Trigger_Mode = ADC_1SEG_TRG; /*ADC采样1段模式*/
ADC_InitStructure.DAT0_TH_Type = ENABLE; //设置ADC比较上阈值中断使能
ADC0_DAT0_TH = 5000; //设置ADC0_DARA0大于ADC0_DAT0_TH值时,触发ADC数值比较中断
ADC_Init(ADC0, &ADC_InitStructure);
ADC0_IF = 0xff; //清中断标志位
ADC0_GAIN0 = 0x0; //开启2/3增益
ADC0_CHN0 = ADC_CHANNEL_7 | (ADC_CHANNEL_16 << 8); //采样通道通道
}
void MCPWM_init(void)
{
MCPWM_InitTypeDef MCPWM_InitStructure;
MCPWM_StructInit(&MCPWM_InitStructure);
MCPWM_InitStructure.CLK_DIV = PWM_PRSC; /* MCPWM时钟分频设置 */
MCPWM_InitStructure.MCLK_EN = ENABLE; /* 模块时钟开启 */
MCPWM_InitStructure.MCPWM_Cnt_EN = ENABLE; /* 主计数器开始计数使能开关 */
MCPWM_InitStructure.MCPWM_WorkModeCH0 = CENTRAL_PWM_MODE; /* MCPWM CH0工作模式:边沿对齐PWM模式 */
MCPWM_InitStructure.GPIO_BKIN_Filter = 0; /* 急停事件(来自IO口信号)数字滤波器时间设置 */
MCPWM_InitStructure.CMP_BKIN_Filter = 0; /* 急停事件(来自比较器信号)数字滤波器时间设置 */
MCPWM_InitStructure.MCPWM_PERIOD = PWM_PERIOD; /* 计数周期设置即MCPWM输出周期*/
MCPWM_InitStructure.TriggerPoint0 = (u16)(-PWM_PERIOD); /* MCPWM_TMR0 ADC触发事件T0 设置 */
。。。
}
void ADC0_IRQHandler(void)
{
if (ADC0_IF & BIT0) //判断是否发生第一采样完成中断
{
ADC0_IF = BIT0; //清除第一段采样完成中断标志位
}
if (ADC0_IF & BIT6)
{
ADC0_IF = BIT6; //清除ADC0_DAT0超阈值中断
}
GPIO0->PDO = ~GPIO0->PDO;
}
void ADC0_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_StructInit(&ADC_InitStructure); //初始化结构体
ADC_InitStructure.IE = ADC_EOS0_IRQ_EN | ADC_DAT0_OV_IRQ_EN; //第一段扫描结束中断使能和ADC_DAT0超阈值中断
ADC_InitStructure.Align = ADC_LEFT_ALIGN; //ADC数据输出左对齐
ADC_InitStructure.UTIMER_Trigger_En = DISABLE; //UTIMER_T0硬件触发ADC采样
ADC_InitStructure.MCPWM_Trigger_En = ADC_MCPWM_T0_TRG;
ADC_InitStructure.FirSeg_Ch = ADC_2_TIMES_SAMPLE; //第一段采样的总通道数: 1~20
ADC_InitStructure.Trigger_Cnt = 0; /*单段触发模式下触发一次采样所需要的事件数:0~15 0表示需要一次触发,15表示需要16次*///修改此处似乎进入中断的频率并没有更改?
ADC_InitStructure.Trigger_Mode = ADC_1SEG_TRG; /*ADC采样1段模式*/
ADC_InitStructure.DAT0_TH_Type = ENABLE; //设置ADC比较上阈值中断使能
ADC0_DAT0_TH = 5000; //设置ADC0_DARA0大于ADC0_DAT0_TH值时,触发ADC数值比较中断
ADC_Init(ADC0, &ADC_InitStructure);
ADC0_IF = 0xff; //清中断标志位
ADC0_GAIN0 = 0x0; //开启2/3增益
ADC0_CHN0 = ADC_CHANNEL_7 | (ADC_CHANNEL_16 << 8); //采样通道通道
}
void MCPWM_init(void)
{
MCPWM_InitTypeDef MCPWM_InitStructure;
MCPWM_StructInit(&MCPWM_InitStructure);
MCPWM_InitStructure.CLK_DIV = PWM_PRSC; /* MCPWM时钟分频设置 */
MCPWM_InitStructure.MCLK_EN = ENABLE; /* 模块时钟开启 */
MCPWM_InitStructure.MCPWM_Cnt_EN = ENABLE; /* 主计数器开始计数使能开关 */
MCPWM_InitStructure.MCPWM_WorkModeCH0 = CENTRAL_PWM_MODE; /* MCPWM CH0工作模式:边沿对齐PWM模式 */
MCPWM_InitStructure.GPIO_BKIN_Filter = 0; /* 急停事件(来自IO口信号)数字滤波器时间设置 */
MCPWM_InitStructure.CMP_BKIN_Filter = 0; /* 急停事件(来自比较器信号)数字滤波器时间设置 */
MCPWM_InitStructure.MCPWM_PERIOD = PWM_PERIOD; /* 计数周期设置即MCPWM输出周期*/
MCPWM_InitStructure.TriggerPoint0 = (u16)(-PWM_PERIOD); /* MCPWM_TMR0 ADC触发事件T0 设置 */
。。。
}
void ADC0_IRQHandler(void)
{
if (ADC0_IF & BIT0) //判断是否发生第一采样完成中断
{
ADC0_IF = BIT0; //清除第一段采样完成中断标志位
}
if (ADC0_IF & BIT6)
{
ADC0_IF = BIT6; //清除ADC0_DAT0超阈值中断
}
GPIO0->PDO = ~GPIO0->PDO;
}
您需要登录后才可以回复 登录 | 注册