stm32定时器部分 产生spwm波

2023-10-29


【stm32定时器部分学习笔记】产生spwm波

用的是野火的例程【stm32定时器部分学习笔记】产生spwm波

main函数:

#define CLI() __set_PRIMASK(1)       
#define SEI() __set_PRIMASK(0)    

int main(void)

 CLI();
 SEI();
 
 TIM34_PWM_Init();
 
 while (1)
 {

 }
}

 

bsp_pwm_output.c用户文件

void TIM3_PWM_Init(void)
{
 TIM34_GPIO_Config();
 TIM34_Mode_Config();

}

 

 

static void TIM34_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB2Periph_AFIO, ENABLE);

 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

 
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
其中,引脚PA6和PA7的复用功能就是TIM3的CH1通道,和CH2通道。所以要开启复用时钟。同时要注意,定时器的时钟不是直接来自APB1APB2,而是来自于输入为APB1APB2的一个倍频器。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。具体见http://blog.csdn.net/yx_l128125/article/details/7879506,这里TIM3,4为APB1的2倍频后,时钟为72MHZ。

static void TIM34_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef     TIM_OCInitStructure;
         TIM_BDTRInitTypeDef   TIM_BDTRInitStructure;
         NVIC_Configuration();

           
        
                 
         TIM_TimeBaseStructure.TIM_Period = 7199;//产生的spwm波的周期为T=1*7200/72M=100us(10KHz)
        TIM_TimeBaseStructure.TIM_Prescaler = 0;//设置预分频:不预分频,即为72MHz
         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分频系数:不分频(这里用不到)
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //向上计数模式
         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//不懂什么意思
         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化定时器3的基础数据
        
         TIM_DeInit(TIM4);   //复位TIM4定时器,使之进入初始状态   其功能为复位外设PPP的所有寄存器至缺省值         
         TIM_TimeBaseStructure.TIM_Period=1;  //自动装载寄存器的值 
         TIM_TimeBaseStructure.TIM_Prescaler= 3599;   //时钟预分频数 使TIM4_CLK=20KHz
         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频:TIM4每次定时的时间T=2*3600/72M=100us
         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//初始化定时器4的基础数据
      
         TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除中断位
         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允许TIM4中断   

 

        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置为PWM模式1  
         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//  开启oc*输出到对应引脚
         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能
         TIM_OCInitStructure.TIM_Pulse =50* 7200 / 100;//占空比为50%
         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平(极性为正)
         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
         TIM_OC1Init(TIM3, &TIM_OCInitStructure);
         TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能TIM3的通道1和通道2            
        
         TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
         TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
         TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
         TIM_BDTRInitStructure.TIM_DeadTime = 12;
         TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
         TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
         TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
         TIM_BDTRConfig(TIM3, &TIM_BDTRInitStructure);
    
         TIM_CtrlPWMOutputs(TIM3, ENABLE); //开启定时器3的PWM模式

         TIM_Cmd(TIM3, ENABLE);                   //使能定时器3
        TIM_Cmd(TIM4, ENABLE);                   //使能定时器3
 
}

中断的初始化函数

static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
 
 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
 
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

stm32f10x_it.c 中断路径处理

void TIM4_IRQHandler(void)·
{
 static vu16 sign = 0;
 static vu16 Counter_sine=0;
 static vu16 Duty_Cycle_sinewavetable[128]={
  0x0,0x83,0x105,0x187,0x209,
  0x28A,0x30A,0x38A,0x409,0x486,
  0x502,0x57D,0x5F7,0x66F,0x6E5,
  0x75A,0x7CC,0x83D,0x8AB,0x917,
  0x981,0x9E8,0xA4D,0xAAF,0xB0E,
  0xB6B,0xBC4,0xC1B,0xC6E,0xCBE,
  0xD0B,0xD54,0xD9A,0xDDD,0xE1C,
  0xE57,0xE8F,0xEC3,0xEF3,0xF1F,
  0xF48,0xF6C,0xF8D,0xFA9,0xFC2,
  0xFD6,0xFE6,0xFF3,0xFFB,0xFFF,
  0xFFF,0xFFB,0xFF3,0xFE6,0xFD6,
  0xFC2,0xFA9,0xF8D,0xF6C,0xF48,
  0xF1F,0xEF3,0xEC3,0xE8F,0xE57,
  0xE1C,0xDDD,0xD9A,0xD54,0xD0B,
  0xCBE,0xC6E,0xC1B,0xBC4,0xB6B,
  0xB0E,0xAAF,0xA4D,0x9E8,0x981,
   0x917,0x8AB,0x83D,0x7CC,0x75A,
   0x6E5,0x66F,0x5F7,0x57D,0x502,
   0x486,0x409,0x38A,0x30A,0x28A,
   0x209,0x187,0x105,0x83,0x0};
 if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) == SET)
 {
  if(sign == 0)
  {
         TIM_SetCompare1(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
         TIM_SetCompare2(TIM3,0);
         Counter_sine++;
         if(Counter_sine==100)  //
         {
              Counter_sine=0;
              sign = 1;
         }
  }else{
         TIM_SetCompare1(TIM3,0);
         TIM_SetCompare2(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
         Counter_sine++;
         if(Counter_sine==100)
         {
              Counter_sine=0;
              sign = 0; 
         }
   }
 }
 TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
}

spwm波产生的原理就是,按正弦规律改变pwm的波的占空比,滤出的基波的频率是改变占空比的频率。

TIM4计时溢出中断,每中断一次,在中断函数中,改变TIM3的比较寄存器的值,即修改占空比。

TIM4_CLK的中断频率是10Khz,又半个周期采样100个点,即半个周期要改100次占空比,也即1个周期改200次占空比,所以改变占空比的频率是10KHZ/200=50hz。基波频率为50hz。注意这个表示只有半个周期的。

 中间还有很多不懂的地方,
比如
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能是干什么的?我把它去掉也没什么变化啊?
 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

这两句也不懂。
TIM_OCInitStructure.TIM_Pulse =50* 7200 / 100;//占空比为50%占空比不是都随着变化了?为什么还要再设置一个50%的占空比?
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平(极性为正)
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
反向端口到底是干嘛用的。。。

还有就是,为什么表里有128个点,但是半个周期采样100个,当然这样周期是可以保证50hz,但如果我把100改为127,周期是按照预想的所变化了,即(10KHZ/256=39.0HZ)但是波形确无法完美互补。。如图:

【stm32定时器部分学习笔记】产生spwm波

这个怎么破?

 

 

接下来上双极性的spwm:

【stm32定时器部分学习笔记】产生spwm波

程序部分,就是把死区给去掉了。

中断函数修改了其中的数组

void TIM4_IRQHandler(void)
{
 static vu16 sign = 0;
 static vu16 Counter_sine=0;
 static vu16 Duty_Cycle_sinewavetable[128]={
 3783,3952,4150,4320,4489,4658,4828,4997,5138,5308,
 5449,5618,5760,5901,6014,6155,6268,6381,6494,6607,
 6691,6776,6861,6917,7002,7058,7087,7143,7171,7171,
 7200,7200,7200,7171,7171,7143,7087,7058,7002,6917,
 6861,6776,6691,6607,6494,6381,6268,6155,6014,5901,
  5760,5618,5449,5308,5138,4997,4828,4658,4489,4320,
  4150,3952,3783,3614,3444,3275,3077,2908,2738,2569,
  2400,2230,2089,1920,1778,1609,1468,1327,1214,1072,
  960,847,734,621,536,451,367,310,225,169,141,84,56,56,
  28,28,28,56,56,84,141,169,225,310,367,451,536,621,734,
  847,960,1072,1214,1327,1468,1609,1778,1920,2089,2230,
  2400,2569,2738,2908,3077,3275,3444,3614
  };
 if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) == SET)
 {
 
         TIM_SetCompare1(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
       
         Counter_sine++;
         if(Counter_sine==128)  //?????100??
         {
              Counter_sine=0;
         }
   }
 TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
}

注意这个数组是完整的正弦波了;关于数字的取得也想分享一下,作为菜鸟表示研究了好久。

因为自动装载值是7200,所以要以7200作为参考,如3600就是占空比为50%,然后用excel做表。大家不要笑话我哈,网上有正弦波生成表,用于单片机产生正弦波的,一般以256为最大比列,然后我就把生成的值除以256乘以7200得到上述数组。

注意,想要得到50hz的正弦波,就要使中断频率为50Hz*128=6400hz,根据公式反推 TIM_TimeBaseStructure.TIM_Period,TIM_TimeBaseStructure.TIM_Prescaler的值,也就是72M/(TIM_Period+1)*(TIM_Prescaler+1)=6400,

我就取

TIM_TimeBaseStructure.TIM_Period=4;          

TIM_TimeBaseStructure.TIM_Prescaler= 2249; 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32定时器部分 产生spwm波 的相关文章

  • ubuntu 下 linux 2.6.18.tar.gz 内核编译,Ubuntu安装Linux2.6.35内核编译

    Ubuntu12 04 参考 百度 在ubuntu安装Linux2 6 35内核 https www linuxidc com Linux 2011 08 40124 htm http www mamicode com info detai
  • 教资高中信息技术 倒数第四天

    第一天 过教材 因为 时间紧张 大部分简写 用于复习 总结 1信息的基本特征 普传功夫真驾驶 2信息技术发展阶段 语文印电计 3人类获取信息途径 直接 间接 4搜索引擎 全文 目录 元 5信息管理过程 信息采集 加工 储存 编码 6人工智能
  • upload-labs通关记录

    upload labs源码地址 https github com c0ny1 upload labs upload labs Pass 1 js检查 Pass 2 只验证Content type Pass 3 黑名单绕过 Pass 4 ht
  • 算法的改进让刷脸核验在极短时间内完成

    刷脸支付系统是一款基于人脸识别系统的支付平台 该系统无需钱包 卡或手机 会自动将消费者面部信息与个人账户相关联 支付时只需要面对设备屏幕上的摄像头即可 整个交易过程 便捷 传统的支付方式 需要把卡 现金 手机等作为介质 但一旦忘记带现金 手
  • STM32与HC-SR04超声波测距

    首先 先来看一下这个模块的基本功能和原理 HC SR04超声波测距模块可提供2cm 400cm的非接触式距离感测功能 测距精度可达高到3mm 模块包括超声波发射器 接收器与控制电路 像智能小车的测距以及转向 或是一些项目中 常常会用到 智能
  • MacOSX上的NFS文件共享

    在MacOSX上接触过rsync方式文件共享和NFS方式文件共享 两种方式的基本使用方式如下 1 rsync方式 这种方式和scp用法很像 rsync file1 user host xx file2 如果传输目录 需要加一个 a参数 如果
  • web 3d场景构建+three.js+室内围墙,仓库,楼梯,货架模型等,第一人称进入场景案例

    翻到了之前的一个案例 基于three js做的仓库布局模拟 地图元素除了大模型外 其他都是通过JSON数据解析动态生成的 例如墙体 柱子门口 地标等 集成了第一人称的插件可以第一人称进入场景有需要的可以下载看看 对想入门的朋友应该有一些参考
  • C# winform之属性 bindingNavigator

    适用于 BindingNavigator控件主要用来绑定数据 可以将一个数据集合与该控件绑定 以进行数据 联动的显示效果 类似于表格显示信息 详细参考 http www cnblogs com qq260250932 p 5507410 h
  • matlab特征提取和分类_SAST Weekly

    SAST weekly 是由电子工程系学生科协推出的科技系列推送 内容涵盖信息领域技术科普 研究前沿热点介绍 科技新闻跟进探索等多个方面 帮助同学们增长姿势 开拓眼界 每周更新 欢迎关注 欢迎愿意分享知识的同学投稿至 eesast mail
  • VR桥梁应用:实现可视化的桥梁监控

    在过去的几年中 虚拟现实 VR 技术已经在多个领域得到了广泛的应用 其中 桥梁巡检是一个特别有前景的应用领域 利用VR技术 我们可以创建一个安全 高效的桥梁巡检方式 帮助工程师和维护人员更好地理解和评估桥梁的状态 通过VR设备 用户可以全方
  • java线程间通讯的几种方式

    文章目录 一 使用同一个共享变量控制 Synchronized wait notify Lock Condition 利用volatile 利用AtomicInteger 二 PipedInputStream PipedOutputStre
  • 108.将有序数组转换为二叉搜索树

    108 将有序数组转换为二叉搜索树 题干描述 解题思路 递归 1 确定递归函数返回值及其参数 2 确定单层递归的逻辑 迭代法 总结 代码实现 递归法 左闭右开 递归法 左闭右闭 迭代法 题干描述 力扣入口 将一个按照升序排列的有序数组 转换
  • ob集群安装部署相关

    一 黑屏 命令行 模式安装ob三节点集群 1 主机规划 主机名 ip 内存 G cpu 安装软件 占用端口 mgr1 172 16 80 57 128 32 observer zone1 obclient obproxy 2881 2882
  • 专科程序员与本科程序员之间有什么区别?

    专科程序员和本科程序员之间最主要的区别在于他们的学历水平以及所接受的教育和培训的深度和广度不同 本科程序员通常拥有更为全面的计算机技术理论知识 同时也接受了更加系统和广泛的相关课程和实践 比如算法 计算机网络 操作系统 软件工程等等 他们研
  • Unity中3D物体添加点击事件

    简单十步曲 按步骤操作可实现对应功能 1 创建摄像机Camera Tag修改Main Camera 2 给Camera添加组件PhysicsRaycaster 3 创建一个空物体 命名EventSystem 4 给刚创建EventSyste
  • vba 获取最后一行

    mainWs Cells mainWs Rows Count 1 End xlUp row
  • FaceNet--Google的人脸识别(转)

    原文地址 http blog csdn net stdcoutzyx article details 46687471 引入 随着深度学习的出现 CV领域突破很多 甚至掀起了一股CV界的创业浪潮 当次风口浪尖之时 Google岂能缺席 特贡
  • 构建安全的数据访问-配置管理(六)

    数据库连接字符串是针对数据访问代码主要考虑的配置管理问题 应认真考虑这些字符串的存储位置以及如何保护它们 特别是当它们包括凭据时 要提高加密管理安全性 使用 Windows 身份验证 确保连接字符串的安全 使用受限制的 ACL 确保 UDL
  • 【内网提权】windows2003本地PR提权详解

    提权利用的漏洞 Microsoft Windows RPCSS服务隔离本地权限提升漏洞 RPCSS服务没有正确地隔离 NetworkService 或 LocalService 帐号下运行的进程 本地攻击者可以利用令牌劫持的方式获得权限提升

随机推荐

  • 项目回顾:一个简单的充值码库存管理系统

    这里写目录标题 背景 需求 第一步 从商家获取充值码 第二步 需要能在平台上售卖充值码 第三步 后台管理系统 实现 防止重复售卖 重复发货 防止超售 邮件系统 性能 小结 背景 回顾一下去年 6 月左右做的一个库存管理系统 需求 我们是做一
  • 各种开源协议

    来源 玩转嵌入式 今天跟大家分享一些开源协议的知识 这些协议缩写词在各种代码 文档中随处可见 可又有多少人对这些知识细细研究过呢 作为一名专业的嵌入式系统开发人员这些东西都是一种素养 特别是当你自己要开源一些东西的时候该如何选择开源协议就变
  • 一个移植十分方便的malloc函数族的实现

    相信学习过c语言的人都知道malloc free函数 这里就不多说怎么用了 这里要说的是 提供它们的实现 该实现方法由uboot中malloc等函数的实现改编而来 已经过验证 没有问题 多说一句 该实现支持物理地址malloc free 不
  • Vue 使用 Markdown标记语言编辑器(MavonEditor)

    文章目录 1 实现效果 2 直接撸 MavonEditor 上代码 2 1 npm安装 MavonEditor 2 2 在需要使用Markdown的Vue组件导入mavonEditor 2 3 vue页面使用 3 参考 1 实现效果 本篇文
  • 7-10倍写入性能提升:剖析WiredTiger数据页无锁及压缩黑科技

    导语 计算机硬件在飞速发展 数据规模在急速膨胀 但是数据库仍然使用是十年以前的架构体系 WiredTiger 尝试打破这一切 充分利用多核与大内存时代来重新设计数据库引擎 达到 7 10 倍写入性能提升 本文由袁荣喜向 高可用架构 投稿 通
  • order by与索引

    ORDER BY 通常会有两种实现方法 一个是利用有序索引自动实现 也就是说利用有序索引的有序性就不再另做排序操作了 另一个是把结果选好之后再排序 用有序索引这种 当然是最快的 不过有一些限制条件 来看下面的测试 测试数据 student表
  • Matplotlib数据可视化

    e 安装及使用 安装 pip install i https mirrors aliyun com pypi simple matplotlib 使用 import Matplotlib pyplot as plt 操作需要numpy数据对
  • uni-app 布局固定头部,内容滚动

    1 代码
  • ios部分机型出现select、input等控件点击后失效不可再次点击dug

    问题描述 在昨天晚上的时候测试突然告诉我一个问题 在iphone 6s中select选择器在第一次点击后 其他的选择无法点击 整个手机都属于暂时性死机状态 问题分析 当时首先对代码进行了排查 排除是逻辑方面的问题 经过多方面验证发现只有6s
  • TensorFlow笔记:激活函数

    tf nn sigmid 函数 函数表达式 f x 1 1
  • h5+js+ajax+百度翻译API:实现翻译功能

    使用前端技术 h5 js ajax开发网页翻译功能 调用百度开放平台的API 入门级前端demo 非常详细好入手 功能为 点击Translate按钮 实现英译汉 页面如下 一 appID和key值准备 在百度开放平台https api fa
  • popState 监听浏览器切换路由

    浏览器内 popState 监听器使用 在前端开发过程中 在一些业务场景中可能会遇到监听浏览器前进 后退 控制路由等情况 我们可以使用Web API提供的popState事件来处理这些情况 提到popState 应用中 通常pushStat
  • python语法-def()详细介绍(特别全)

    1 什么是函数 在 Python 中 函数是一种可重用的代码块 用于执行特定的任务或操作 函数可以接受输入参数 并返回输出结果 从而实现模块化和封装性编程的目的 Python 中定义函数的语法如下 def function name par
  • 网络安全比赛A模块任务书

    前言 这是作者这几个月来的第一次更新文章 问就是太忙了 最近要去参加国赛 在此重新回来写文章 也不知道能写多久 就当练习了 一 A模块基础设施设置 安全加固 A 1 登录加固 1 密码策略 a 最小密码长度不少于8个字符 将密码长度最小值的
  • data1

    两数之和 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 给定 nums 2 7 11
  • vue3+ts预览和下载word,pdf,excel

    文章目录 前言 一 vue office相比其他库的优势 二 使用步骤 1 引入库 2 组件封装 3 组件使用 总结 前言 最近项目一直在做一些文档方面的相关操作 例如查看文件 做文件导出 一般的导出格式为word excel pdf 等
  • STM32 实战中的一些技术问题解决

    开发板高速USB接口延迟问题 首先是检查硬件接口布线和插槽整体有无损坏 第二是发送数据包进行测试 判断是哪种数据类型和字段会发生时延 然后对症解决问题 以上两种方式能够解决80 的延迟问题 当然 也有比较少见的疑难杂症 发现当 USB 线拔
  • P1182 数列分段 Section II

    题目描述 对于给定的一个长度为N的正整数数列 A 现要将其分成 M M N 段 并要求每段连续 且每段和的最大值最小 关于最大值最小 例如一数列 4 2 4 5 1 要分成 3 段 将其如下分段 4 2 4 5 1 第 1 段和为 6 第
  • ubuntu18.04安装显卡驱动(四种方式)

    一 引言 安装ubuntu显卡驱动根据经验来看一共有四种方法 推荐使用方法三和方法四最简单快捷 一般方法三就可以解决 方法三不可以的话再用其他办法 反正自己多试试 大不了就重装系统嘛 还有一个新系统先别配置其他东西 先安显卡驱动 根据实验室
  • stm32定时器部分 产生spwm波

    用的是野火的例程 main函数 define CLI set PRIMASK 1 define SEI set PRIMASK 0 int main void CLI SEI TIM34 PWM Init while 1 bsp pwm o