当前位置: 首页 > news >正文

TI MSPM0G3507 简易PID项目显示和按键控制

注释掉了一些测试代码,具体UI状态机未实现,已实现按键控制和UI选择切换。 

#include <stdio.h>      // 标准输入输出(最基础,无依赖)
#include <string.h>     // 字符串处理函数(标准库,早于自定义头文件)
#include "ti_msp_dl_config.h"  // TI 驱动库配置(需先于驱动库头文件)
#include "mid_button.h"   // 自定义模块头文件(底层外设/组件)
#include "oled.h"         // 自定义模块头文件(可能依赖 mid_button 等)
#include "lcd.h"          // 自定义模块头文件(注意:需确保其依赖的驱动库头文件已包含)
#include "key_task.h"     // 任务层头文件(依赖底层组件)
#include "mid_uart.h"     // 自定义模块头文件(若与其他模块无强依赖,可后置)
#include "encoder.h"
#include "timer.h"
#include "key.h"
#include "motor.h"
#include "app.h"
#include "app_sys_mode.h"#include "stdlib.h"#define SPEED_WAVEFORM_REDUCTION_FACTOR 10#define SPEED_ENCODER_VALUE_MAX ( -(SPEED_ENCODER_VALUE_MIN) )
#define SPEED_ENCODER_VALUE_MID 0
#define SPEED_ENCODER_VALUE_MIN (-100)#define DISTANCE_ENCODER_VALUE_MAX ( -(DISTANCE_ENCODER_VALUE_MIN) )
#define DISTANCE_ENCODER_VALUE_MID 0
#define DISTANCE_ENCODER_VALUE_MIN (-360)//重定义printf
int fputc(int ch, FILE *stream)
{while( DL_UART_isBusy(UART_0_INST) == true );DL_UART_Main_transmitData(UART_0_INST, ch);return ch;
}volatile unsigned int delay_time=0;volatile unsigned char uart_data = 0;
volatile unsigned int i=0;void uart0_send_char(char ch);
void uart0_send_string(char* str);void ui_home_page(void);	//首页初始化
void ui_encoder_value_update(void);//编码器数据显示//搭配滴答定时器实现的精确ms延时
void delay_ms(unsigned int ms){delay_time=ms;while(delay_time != 0);
}
// 生成范围在 0 到 88 之间的随机整数
int generate_random(void)
{return (rand() % 89);
}bool motor_status = false;//电机状态
int curve_x = 0;int main(void)
{SYSCFG_DL_init();//NVIC_EnableIRQ(KEY_INT_IRQN);//开启按键引脚的GPIOB端口中断//DL_GPIO_setPins(LED1_PORT,LED1_PIN_22_PIN);//清除串口中断标志//NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//使能串口中断//NVIC_EnableIRQ(UART_0_INST_INT_IRQN);//清除定时器中断标志//NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN);//使能定时器中断//NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);//系统参数初始化sys_event_init();//屏幕初始化lcd_init();ui_home_page();//编码器初始化encoder_init();//定时器初始化timer_init();//按键初始化user_button_init();//	delay_cycles(8000000*2);
//	//显示定速界面
//	ui_speed_page();
//	//显示定速界面的PID参数
//	ui_speed_page_value_set(12.1, 2.2, 3.12, 50, 30, 1);
//	//I值位置显示选择框
//	ui_speed_page_select_box(1);
//	//D值位置显示选中框
//	ui_parameter_select_box_bold(2);int sys_time=0;DL_TimerG_setCaptureCompareValue(PWM_0_INST,0,GPIO_PWM_0_C1_IDX);while (1) {//__asm__("nop");sys_time++;/*DL_GPIO_clearPins(LED1_PORT,LED1_PIN_22_PIN);//输出低电平delay_ms(1000);//延时大概1SDL_GPIO_setPins(LED1_PORT,LED1_PIN_22_PIN);  //输出高电平delay_ms(1000);//延时大概1S*//*if( DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN) == 0){DL_GPIO_setPins(LED1_PORT, LED1_PIN_22_PIN);//高电平}else{DL_GPIO_clearPins(LED1_PORT, LED1_PIN_22_PIN);//低电平}*/// 呼吸灯渐亮过程
//        for (i = 0; i <= 998; i++)
//        {
//            // 设置 LED 亮度
//            DL_TimerG_setCaptureCompareValue(PWM_0_INST,i,GPIO_PWM_0_C1_IDX);
//            delay_ms(1);  // 延迟以控制亮度变化速度
//        }// 呼吸灯渐暗过程
//        for (i = 998; i > 0; i--)
//        {
//            // 设置 LED 亮度
//            DL_TimerG_setCaptureCompareValue(PWM_0_INST,i,GPIO_PWM_0_C1_IDX);
//            delay_ms(1);  // 延迟以控制亮度变化速度
//        }//按键扫描
//		if(sys_time%20==0){
//			flex_button_scan();
//			
//		}if(sys_time%10==0){//使用随机数刷新波形//draw_speed_curve(0, 0, 319, 88, GREEN, BLACK, generate_random() );}if(sys_time%20==0){//ui_home_page_select(get_app_key_current_mode());//ui_encoder_value_update();}//电机扫描if(sys_time%20==0){if(motor_status==true){DL_TimerG_setCaptureCompareValue(PWM_0_INST,999,GPIO_PWM_0_C1_IDX);set_motor(9999,0);}else{DL_TimerG_setCaptureCompareValue(PWM_0_INST,0,GPIO_PWM_0_C1_IDX);stop_motor();}}delay_cycles(CPUCLK_FREQ/1000*2);if(sys_time>=99999) sys_time=0;//flex_button_scan();//delay_ms(20);}}//定时器的中断服务函数 已配置为1秒的周期
void TIMER_0_INST_IRQHandler(void)
{//如果产生了定时器中断switch( DL_TimerG_getPendingInterrupt(TIMER_0_INST) ){case DL_TIMER_IIDX_ZERO://如果是0溢出中断//将LED灯的状态翻转//DL_GPIO_togglePins(LED1_PORT, LED1_PIN_22_PIN);break;default://其他的定时器中断break;}
}//滴答定时器中断服务函数
void SysTick_Handler(void)
{if( delay_time != 0 ){delay_time--;}
}
/*
void GROUP1_IRQHandler(void)//Group1的中断服务函数
{//读取Group1的中断寄存器并清除中断标志位switch( DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1) ){//检查是否是KEY的GPIOB端口中断,注意是INT_IIDX,不是PIN_22_IIDXcase KEY_INT_IIDX://如果按键按下变为高电平if( DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN) > 0 ){//设置LED引脚状态翻转//DL_GPIO_togglePins(LED1_PORT, LED1_PIN_22_PIN);}break;}}
*///串口发送单个字符
void uart0_send_char(char ch)
{//当串口0忙的时候等待,不忙的时候再发送传进来的字符while( DL_UART_isBusy(UART_0_INST) == true );//发送单个字符DL_UART_Main_transmitData(UART_0_INST, ch);
}
//串口发送字符串
void uart0_send_string(char* str)
{//当前字符串地址不在结尾 并且 字符串首地址不为空while(*str!=0&&str!=0){//发送字符串首地址中的字符,并且在发送完成之后首地址自增uart0_send_char(*str++);}
}//串口的中断服务函数
void UART_0_INST_IRQHandler(void)
{//如果产生了串口中断switch( DL_UART_getPendingInterrupt(UART_0_INST) ){case DL_UART_IIDX_RX://如果是接收中断//接发送过来的数据保存在变量中uart_data = DL_UART_Main_receiveData(UART_0_INST);//将保存的数据再发送出去uart0_send_char(uart_data);break;default://其他的串口中断break;}
}

相关文章:

  • C++语法系列之模板进阶
  • 【C#】一个简单的http服务器项目开发过程详解
  • MySQL备份工具:mysqldump
  • leetcode hot100刷题日记——33.二叉树的层序遍历
  • 单例模式的类和静态方法的类的区别和使用场景
  • Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 关于 java:3. Java 常用类库与数据结构
  • Spark核心:单跳转换率计算全解析
  • 【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】
  • 跟我学c++中级篇——隐式转换的意义
  • 使用 Let‘s Encrypt 和 Certbot 为 Cloudflare 托管的域名申请 SSL 证书
  • C++类设计新思路:借鉴Promise链式调用的封装模式
  • 索引的选择与Change Buffer
  • Github 热点 Github 热点 Syncthing:多台设备,持续同步文件,安全同步,隐私无忧!
  • Java网络编程实战:TCP/UDP Socket通信详解与高并发服务器设计
  • [蓝桥杯]分考场
  • 具有离散序列建模的统一多模态大语言模型【AnyGPT】
  • 如何基于端口监控FreeSWITCH的Recv-Q?
  • 某航参数逆向及设备指纹分析
  • 济南高新区网站建设/苹果cms播放器
  • 网站备案怎么更改吗/哪个浏览器看黄页最快夸克浏览器
  • 昌吉市住房和城乡建设局网站/企业网页设计与推广
  • 网站建设用什么网站好一点/网站运营推广方案
  • 二手书店网站建设项目规划书/seo的收费标准
  • 海口网站制作方案/百度关键词怎么做