keil开发环境配置

1.CCS开发学习链接
2.keil+sysconfig开发

CCS常用方法

多文件编译

如何在CCS中添加文件路径

11
11

keil+Syconfig开发出现常见问题及其解决方法

1.在导入SDK中Syconfig文件时候没用Import选项:说明版本太低需要更新Kei版本
2.出现错误:Missing argument: —board or —device must be specified解决方法
参考链接: Missing argument: —board or —device must be specified解决方法
1

确保在该文件显示在屏幕上时,再打开SysConfig

CCS基础及其TI

GPIO

1
2
3
4
5
6

DL_GPIO_setPins(GPIO_Regs *gpio, uint32_t pins)//设置为输出高电平

DL_GPIO_ClearPins(GPIO_Regs *gpio, uint32_t pins)//设置为输出低电平

DL_GPIO_togglePins(GPIO_Regs *gpio, uint32_t pins)//高低电平翻转

系统时钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// SysTick->VAL,滴答定时器去延迟
void delay_ms(uint32_t ms)
{
uint32_t ticks = ms * (CPUCLK_FREQ / 1000); // 1000 * (32000000 / 1000) = 32,000,000
uint32_t count_new = 0, count_old = 0;
uint32_t count = 0;
count_old = SysTick->VAL;

while(1)
{
// 获取最新的计数值
count_new = SysTick->VAL;

// 如果最新和上一次的值不一样,说明有改动
if (count_new != count_old)
{
// 如果新的值比旧的值小
if (count_new < count_old)
{
count = count + (count_old - count_new);
}
// 如果新的值比旧的值大
else if (count_new > count_old)
}
{
count = count + SysTick->LOAD - count_new + count_old;

// 更新旧的值
count_old = count_new;

// 如果已经达到我们的计数的次数了就结束
if (count >= ticks) return;
}
}
}

2.
volatile uint32_t delay_value = 0;

void delay_ms(uint32_t ms)
{
delay_value = 1000;
while (delay_value != 0);
}

void SysTick_Handler(void)
{
delay_value--;
}

SY配置
SY配置

阻塞延迟和非阻塞延迟:

采用空语句的方式,称为阻塞延迟
采用中断的方式,称为非阻塞延迟

邓兄给的代码:
邓哥给的代码

串口通信

1
2
3
4
5
6
7
8
9
10
11
12
13

//两个串口发送函数
DL_UART_transmitData(UART_0_INST,'c' )//1.串口种类2.发送字符
//发送字符串函数
void uart_sendString(char* str)
{
while(*str!=0)
{
while(DL_UART_isBusy(UART_0_INST)==true);
DL_UART_transmitData(UART_0_INST, *str);
str++;
}
}

PWM输出

SY设置:
SY设置

1
2

DL_TimerG_setCaptureCompareValue(PWM_INST, 500, DL_TIMER_CC_0_INDEX);//用于设置PWM占空比输出

常用模块

OLED屏幕

MPU6050

MPU6050设置

刚刚移MPU库,移半天一堆错,想想还是自己积分算角度吧
学习链接: !基于江科大MPU6050移植进入MSPM0

基于江科大MPU6050姿态解算代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "stm32f10x.h"
#include "MPU6050.h"
#include "math.h"

#define RtA (57.2957795f) // 弧度转角度,180/π ≈ 57.2957795
#define Ki 0.005f // 积分系数
#define DT 0.005f // 计算周期的一半,单位s

// 加速度和角速度
int16_t AX, AY, AZ, GX, GY, GZ;

typedef struct {
float c1, c2, c3, a1, a2, a3, a;
} Degree;

Degree d;

typedef struct {
float q0, q1, q2, q3;
float exInt, eyInt, ezInt;
} Quater;

Quater q = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};

void Dmp_Init(void) {
MPU6050_Init();
}

void MPU6050_Read(void) {
MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);

// 转换为物理量
d.c1 = GX / 131.0f; // 角速度(°/s)
d.c2 = GY / 131.0f;
d.c3 = GZ / 131.0f;

// 转换为rad/s
d.c1 /= RtA;
d.c2 /= RtA;
d.c3 /= RtA;

d.a1 = AX / 16384.0f; // 加速度(g)
d.a2 = AY / 16384.0f;
d.a3 = AZ / 16384.0f;

// 加速度归一化
float norm = sqrtf(d.a1 * d.a1 + d.a2 * d.a2 + d.a3 * d.a3);
if (norm > 1e-6f) { // 防止除零
float inv_norm = 1.0f / norm;
d.a1 *= inv_norm;
d.a2 *= inv_norm;
d.a3 *= inv_norm;
d.a = 1.0f;
} else {
d.a = 0.0f;
}
}

void ComputeEulerAngles(float *pitch, float *roll, float *yaw) {
MPU6050_Read();

// 计算姿态误差
float gx = d.c1, gy = d.c2, gz = d.c3;
float gravity_x = 2.0f * (q.q1 * q.q3 - q.q0 * q.q2);
float gravity_y = 2.0f * (q.q0 * q.q1 + q.q2 * q.q3);
float gravity_z = q.q0*q.q0 - q.q1 * q.q1 - q.q2 * q.q2 + q.q3*q.q3;

float error_x = d.a2 * gravity_z - d.a3 * gravity_y;
float error_y = d.a3 * gravity_x - d.a1 * gravity_z;
float error_z = d.a1 * gravity_y - d.a2 * gravity_x;

// 更新四元数
float Kp = 0.5f;

// 误差积分
q.exInt += Ki * error_x ;
q.eyInt += Ki * error_y ;
q.ezInt += Ki * error_z ;

// 修正角速度
gx += Kp * error_x + q.exInt;
gy += Kp * error_y + q.eyInt;
gz += Kp * error_z + q.ezInt;

// 四元数微分方程
float q0_dot = (-q.q1 * gx - q.q2 * gy - q.q3 * gz) * DT;
float q1_dot = (q.q0 * gx - q.q3 * gy + q.q2 * gz) * DT;
float q2_dot = (q.q3 * gx + q.q0 * gy - q.q1 * gz) * DT;
float q3_dot = (-q.q2 * gx + q.q1 * gy + q.q0 * gz) * DT;

// 更新四元数
q.q0 += q0_dot;
q.q1 += q1_dot;
q.q2 += q2_dot;
q.q3 += q3_dot;

// 归一化
float norm = sqrtf(q.q0 * q.q0 + q.q1 * q.q1 + q.q2 * q.q2 + q.q3 * q.q3);
if (norm > 1e-6f) {
float inv_norm = 1.0f / norm;
q.q0 *= inv_norm;
q.q1 *= inv_norm;
q.q2 *= inv_norm;
q.q3 *= inv_norm;
}

// 计算欧拉角
float q0q0 = q.q0 * q.q0;
float q1q1 = q.q1 * q.q1;
float q2q2 = q.q2 * q.q2;
float q3q3 = q.q3 * q.q3;

*roll = atan2f(2.0f * (q.q2 * q.q3 + q.q0 * q.q1), q0q0 - q1q1 - q2q2 + q3q3);
*pitch = asinf(-2.0f * (q.q1 * q.q3 - q.q0 * q.q2));
*yaw = atan2f(2.0f * (q.q1 * q.q2 + q.q0 * q.q3), q0q0 + q1q1 - q2q2 - q3q3);

// // 转换为度
// *roll *= RtA;
// *pitch *= RtA;
// *yaw *= RtA;
}

真题

24年颠赛