Keil MDK不支持结构体对指定元素初始化

结构体对指定元素初始化就是类似下面的操作:

struct test
{
    int a;
    int b;
};

struct test t = 
{
    .a = 1,
    .b = 2
};

这样就能不按照结构体中的元素顺序对结构体进行初始化,这种方式在linux内核代码中使用的很多很多,但是在KEIL MDK中使用却报错:“expected an expression”。其实就是编译器不支持C99标准,我们可以打开C99模式让编译器支持C99标准:
这里写图片描述

在Misc Controls中添加–C99即可,如果使用的是MDK5的话在上面会有一个C99 Mode选项,选上即可。参考:http://www.openedv.com/posts/list/37045.htm

打开了C99模式之后可能会出现一些错误是因为原来的代码不符合C99的标准,例如函数返回类型如果是void的话在可以不用写void,但是C99模式下会报错,需要加上void才行,再如C99允许在函数中间定义变量,而没使用C99之前的的C标准是不支持在函数中间定义变量的,只能在函数的最开始定义所有变量,这点上我还是更喜欢C99标准的!!!。

直流电机的初始化、正反转和刹车控制在Keil5环境中通常是通过编写C语言代码来实现的。这里是一个简化版的例子,展示了如何使用Keil MDK(μVision)和STM32Cube库来管理直流电机: ```c #include "stm32f10x.h" // 包含STM32 HAL库 // 定义电机相关的结构体和全局变量 typedef struct { TIM_HandleTypeDef htim; // 定时器句柄 GPIO_TypeDef *GPIOx; // GPIO引脚定义 uint16_t PinA, PinB; // A和B相的GPIO引脚 } DCMotor; DMotor motor; // 初始化电机参数 void MotorInit(void) { // 初始化GPIO GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = motor.PinA | motor.PinB; GPIO_InitStruct.Mode = GPIO_MODE_AF_HighSpeed; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF2_TIM(motor.GPIOx); // 使用TIMx的通道 HAL_GPIO_Init(motor.GPIOx, &GPIO_InitStruct); // 初始化定时器 TIM_TimeBaseInitTypeDef.TIM_InitStruct; TIM_InitStruct.Prescaler = ...; // 根据系统时钟和所需的PWM频率计算预分频值 TIM_InitStruct.CounterMode = TIM_COUNTERMODE_UP; TIM_InitStruct.Period = ...; // 计算出的周期长度 TIM_InitStruct.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&motor.htim, &TIM_InitStruct); HAL_TIM_Base_Start(&motor.htim); } // 正转/反转控制函数 void MotorChangeDirection(uint8_t direction) { if (direction == LEFT) { HAL_GPIO_WritePin(motor.GPIOx, motor.PinA, GPIO_PIN_SET); HAL_GPIO_WritePin(motor.GPIOx, motor.PinB, GPIO_PIN_RESET); } else { // 右转 HAL_GPIO_WritePin(motor.GPIOx, motor.PinA, GPIO_PIN_RESET); HAL_GPIO_WritePin(motor.GPIOx, motor.PinB, GPIO_PIN_SET); } } // 刹车函数(停止电机) void MotorBrake(void) { HAL_GPIO_WritePin(motor.GPIOx, motor.PinA | motor.PinB, GPIO_PIN_SET); // 断开所有电源 motor.htim.Instance->CR1 &= ~(TIM_CR1_CEN); // 关闭定时器通道 } // 主函数中调用这些函数 int main(void) { MotorInit(); while (1) { // 在主循环里切换方向或刹车 MotorChangeDirection(MOTOR_LEFT); // ...执行其他任务... MotorBrake(); // 刹车 // ...等待一段时间再恢复运行... } return 0; } ``` 请注意,这个示例假设你已经为电机接口配置了正确的硬件,并且你需要根据实际的STM32系列型号替换`GPIOx`,以及调整定时器预分频值和周期长度。此外,这里的LEFT和RIGHT只是代表正转和反转两个方向,你可以根据自己的需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值