C语言开发常见错误-持续更新

1 字节合并时候出现问题 目的想合并i8T1和i8T2两个温度值

 

假设i8T1=-5 //0xFB

i8T2=1 //0x01

u16x=i8T1;

u16x <<=8; //0xFB00

u16x |=i8T2 //

理想值 u16x=0xFB01 ,实际值 u16x=0xFF01

因为u16x |=i8T2 运算中 i8T2 被转换为0xFF01 再| u16x 0xFB00时候所以就变为0xFF01

正确应该写为u16x |=((uint16_t )i8T2&0x00FF) //

2 设备初始化得时候一定记得将局部变量得结构体清0,不然多次调用后肯定会出现配置错误。

void HeatPWMconfigTimer16(void)
{
    HeatPWMGpioconfig();
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
    memset(&timer_ocintpara,0,sizeof(timer_oc_parameter_struct));
    memset(&timer_initpara,0,sizeof(timer_parameter_struct));

    rcu_periph_clock_enable(RCU_TIMER16);

    timer_deinit(TIMER16);

    /* TIMER1 configuration */
    timer_initpara.prescaler         = 47;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = PWM_MAX_DUTY-1;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER16,&timer_initpara);

    /* CH1, CH2 and CH3 configuration in PWM0 mode */
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE;

    timer_channel_output_config(TIMER16, TIMER_CH_0, &timer_ocintpara);
    timer_channel_output_pulse_value_config(TIMER16, TIMER_CH_0, 1);
    timer_channel_output_mode_config(TIMER16, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER16, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
    timer_primary_output_config(TIMER16,ENABLE);
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER16);
    /* auto-reload preload enable */
    timer_enable(TIMER16);
}

3  工程包含文件 main.h User_Data.h  User_Beep.h

总的数据结构放在user_data.h文件中

typedef struct

{

        S_BEEP_DATA sBeepData;

}

S_BEEP_DATA  在User_data.h中定义

问题点:编译器不能识别S_BEEP_DATA结构体

解决:1 User_data.h 中不包含main.h  只包含User_Beep.h

2 User_Beep.c中 包含main.h 不包含User_Beep.h

3 main.h 中包换User_Beep.h User_Data.h

3 Freertos 调用VTaskList 函数 前几次有数据打印,后面无数据打印

原因:VTaskList 函数中每次都会Malloc 0x90个字节的内存,但工程中使用的是heap1.c文件 ,vPortFree()函数为空,内存分配不会释放导致;

解决:选择其它Heap2 3 4.c 的文件,这些文件里分配的内存会释放

4 单片机 堆栈2个堆栈指针MSP PSP

裸机模式:只使用MSP

Freertos: MSP作为系统堆栈(全局变量,中断嵌套);PSP作为任务堆栈(每一个任务都有一个堆栈地址)

 5 HardFault_Handler中断错误

6 编译器V5 转到V6 报错

删除项目文件架内报错文件,如Core_cm4.h ,将C++里面的路径添加

如:D:\keil_v5\ARM\PACK\ARM\CMSIS\5.7.0\CMSIS\Core\Include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值