STM32
直播中

微风挽雨

9年用户 927经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术
私信 关注
[问答]

求助,结束while循环后会跳转至循环前继续执行的问题求解?

问题如题,原本是使用计时器输入捕获功能获取脉冲数的问题,后将代码修改如下使其仅仅只是计数输出一下0至10000的数字:
int main(void) {        u16 i = 0, j;         LED_Init();                             //LED端口初始化        uart_init(115200);        printf("%drn", 70000);  //串口输出程序启动标志  while(1)        {                printf("%drn", i++);                if(i >= 10000) break;        }        LED0 = 0;        printf("%d, %drn", i, j); }在上位机中根据输出数字显示波形,其波形如下:

在跳出while循环后其会跳转至循环前继续执行两次,最终在第三次正常结束。
本人才疏学浅,初次遇到这种情况,真诚求助orz!
以下为原问题,目前来看可以暂时排除计时器的原因。
问题如题,电机的AB相分别连接tiM3的通道1和通道2,主函数代码如下:
/************************************************        通过输入捕获获取有刷直流电机的脉冲数************************************************/ int main(void) {        u16 i = 0, j;         LED_Init();        uart_init(115200);        TIM3_Encoder_Init(65535, 0);        printf("%d, %drn", 70000, 0);  //串口输出程序启动标志        while(i < 10000)  //i为累计检测到的脉冲数,如果累计检测到了10000个脉冲就结束循环        {                j = getEncoder();  //getEncoder()返回本次循环的脉冲数,返回后会将CNT置零                printf("%d, %drn", i, j);  //向串口1输出 累计的脉冲数 和 本次循环获取的脉冲数                if(j < 100) i += j;  //排除可能存在的错误值后将脉冲数累计        }        LED0 = 0;        printf("%d, %drn", i, j); }同时使用上位机观察串口输出的波形,理论上输出累积至10000以上就会结束,可实际输出波形如下:

经多次测试,在累计脉冲数第一次和第二次接近循环判断值时程序会重启并重新计数,至第三次才会正常的结束这个计数过程。
输入捕获部分代码如下:
//arr:自动重装值,测试中使用65535//psc:时钟预分频数,测试中使用0void TIM3_Encoder_Init(u16 arr,u16 psc){          GPIO_InitTypeDef GPIO_InitStructure;        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;        TIM_ICInitTypeDef  TIM_ICInitStructure;        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        GPIO_Init(GPIOA,  GPIO_InitStructure);        GPIO_ResetBits(GPIOA, GPIO_Pin_6 | GPIO_Pin_7);        TIM_TimeBaseStructure.TIM_Period = arr;         TIM_TimeBaseStructure.TIM_Prescaler = psc;         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         TIM_TimeBaseInit(TIM3,  TIM_TimeBaseStructure);         TIM_ICStructInit( TIM_ICInitStructure);        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;        TIM_ICInitStructure.TIM_ICFilter = 0x0A;        TIM_ICInit(TIM3,  TIM_ICInitStructure);        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;        TIM_ICInit(TIM3,  TIM_ICInitStructure);        TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);        TIM_Cmd(TIM3, ENABLE);}//获取当前脉冲数,获取后置0u16 getEncoder(){        u16 temp;        temp = TIM_GetCounter(TIM3);        TIM_SetCounter(TIM3, 0);        return temp;}本人纯纯清澈愚蠢大学生一枚,真诚求助orz!



回帖(1)

挽你何用

2024-5-22 17:49:18
根据您的描述,您想要实现一个从0到10000的计数循环,并在循环结束后继续执行。首先,我们需要确保您的代码中有一个while循环来实现这个功能。以下是一个简单的示例代码,您可以根据自己的需求进行修改:

```c
#include

int main(void) {
    u16 i = 0;
    LED_Init(); // LED端口初始化
    uart_init(115200); // 初始化串口

    while (i < 10000) {
        printf("%dn", i);
        i++;
    }

    // 在这里添加循环结束后要执行的代码
    printf("循环结束,继续执行。n");

    return 0;
}
```

在这个示例中,我们首先初始化LED和串口,然后使用一个while循环来打印从0到10000的数字。当i等于10000时,循环结束。在循环结束后,您可以在while循环之外添加任何需要执行的代码。

如果您遇到循环结束后跳转至循环前的问题,请检查您的代码中是否有任何条件语句(如if语句)或循环控制语句(如break或continue)可能导致这种情况发生。确保这些语句的逻辑正确,以避免意外的跳转。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分