
一、新建立工程

确保新工程没有错误
二、移植

在这个文件路径下进行添加

新建文件夹

在新建文件夹下面建立.c和.h两个文件。.c存放源文件.h存放头文件
打开keil5进行下列操作


将写好的源文件复制到新建立的.c文件


将写好的头文件添加在在新键.h文件里面

添加main测试程序
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "tmx_uart.h"
#include "usmart.h"
#include "tmx_i2c.h"
#include "tmx_at24c02.h"
#include "tmx_oled.h"
#include "tmx_ph2_timer.h"
TMX_UART_DEV* uart_dev;
TMX_I2C_MASTER_DEV * i2c_master_dev;
TMX_AT24C02_DEV * at24c02_dev;
TMX_OLED_DEV * oled_dev;
TMX_PH2_TIMER_DEV* ph2_timer_dev;
uint8_t i2c_buffer[10];
uint8_t i2c_len;
void printfBuffer(uint8_t* buffer,uint16_t len);
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usmart_init(72);
//初始化串口2
uart_dev = tmx_uart_init(TMX_UART1,115200,UART_DMA_ON);
i2c_master_dev = tmx_i2c_master_init();
at24c02_dev = tmx_at24c02_init();
oled_dev = tmx_oled_init();
ph2_timer_dev = tmx_ph2_timer_init();
//开启单次接收
uart_dev->start_receive();
printf("tmx\r\n");
uint8_t temp1 = 0;
uint8_t niming[10];
niming[0] = 0xAB;
niming[1] = 0x00;
niming[2] = 0x00;
niming[3] = 0xF1;
//小端模式,数据长度是 0x0002,低8位放前面niming[4]里,高八位放后面niming[5]
niming[4] = 0x02;
niming[5] = 0x00;
while(1)
{
if(ph2_timer_dev->event == 1){
temp1++;
ph2_timer_dev->event = 0;
//使用匿名上位机显示实时速度
if(temp1 >10){
int16_t speed = ph2_timer_dev->get_speed_left(500);
//处理小端模式
uint8_t* ptr;
ptr = (uint8_t*)&speed;
niming[6] = ptr[0];
niming[7] = ptr[1];
//计算校验数据
uint8_t sumcheck = 0;
uint8_t addcheck = 0;
uint8_t flen = niming[4]+niming[5]*256;
for(uint8_t i=0;i<(flen+6);i++){
sumcheck += niming[i];
addcheck += sumcheck;
}
niming[8] = sumcheck;
niming[9] = addcheck;
//通过串口发送
//HAL_UART_Transmit(&(uart_dev->uart),niming,10,HAL_MAX_DELAY);
temp1 = 0;
}
}
if(uart_dev->finish == 1){
//识别usmart格式 u_xxx(yyy)\r\n
if(uart_dev->length>=8 && uart_dev->buffer[0] == 'u' && uart_dev->buffer[1] == '_' && uart_dev->buffer[uart_dev->length-2] == '\r' && uart_dev->buffer[uart_dev->length-1] == '\n'){
//如果时usmart格式,交由usmart处理
usmart_action((char *)(uart_dev->buffer));
}
else{
//如果不是,直接打印
printfBuffer(uart_dev->buffer,uart_dev->length);
}
//处理完成之后,再次开启接收
uart_dev->start_receive();
}
}
}
/********** USMART测试 **************/
void u_test1(uint8_t a){
uart_dev->start_transmit((uint8_t*)"u_test1\r\n",9);
}
void printfBuffer(uint8_t* buffer,uint16_t len){
printf("data len = %d\r\n",len);
for(uint8_t i = 0;i<len;i++){
printf("%c",buffer[i]);
}
printf("\r\n");
}
运行一遍

有错

替换一下(替换串口文件)


有串口(UART)的都先注释掉

添加这个



移植完成
将程序烧录如板子里面,在匿名助手中验证

数据项 "A" 的数值为 0,数据波形暂无动态变化,可能处于初始连接或未启动数据传输的状态。
/* USER CODE BEGIN WHILE */
while (1)
{
// 1. 动态设置PWM占空比
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty);
// 2. 获取控制引脚电平(也可直接用PWM引脚控制电机/呼吸灯)
ctrl_level = HAL_GPIO_ReadPin(CTRL_PORT, CTRL_PIN);
// 3. 保留原格式发送PWM占空比+控制电平(不修改发送格式)
Ano_SendPwmData(duty, ctrl_level);
// 4. 占空比渐变逻辑(实现呼吸/电机转速变化)
if (dir) {
duty += 10; // 占空比+1%
if (duty >= 999) dir = 0;
} else {
duty -= 10; // 占空比-1%
if (duty <= 0) dir = 1;
}
HAL_Delay(20); // 控制渐变速度
/* USER CODE END WHILE */
将原程序里面的代码替换为这段代码即可得到一下波形

注释:本次使用的工程模板为正点原子提供的工程模板