谈到38kHz可能大部分人不明白,为什么要配置IO口以38kHz来输出?!
但是如果接触过红外遥控的人想必就会比较清楚,现在市面上售卖的一体化红外接收头只接收38kHz的红外调制信号,一般的红外发射端都是板载455kHz,通过整顿分频,得出了约等于38kHz的频率,再跟数据发射脚进行“与”操作来实现数据发送,这样既可以提高发射效率又可以降低电源功耗。
如果只是编写现成红外模块的程序,网上有比较多的445kHz晶振调制38kHz频率的程序可以借鉴,下面给出M0(stm32f030f4p6)基于外部8M晶振的38kHz调制频率代码~

void User_Infrared_Config()
{//创建结构体GPIO_InitTypeDef          GPIO_InitStructure;TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;TIM_OCInitTypeDef         TIM_OCInitStructure;//使能GPIO时钟,定时器TIM3时钟RCC_AHBPeriphClockCmd(Infrared_GPIO_CLK,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//DPIO配置及初始化 声明引脚复用GPIO_InitStructure.GPIO_Pin   = Infrared_pin;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;GPIO_Init(Infrared_GPIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(Infrared_GPIO_PORT,GPIO_PinSource1,GPIO_AF_1);//定时器配置TIM_TimeBaseStructure.TIM_Period        = (SystemCoreClock/38000)-1;TIM_TimeBaseStructure.TIM_Prescaler     = 0;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_Cmd(TIM3,ENABLE);//TIM_CH4 PWM配置TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse       = (SystemCoreClock/38000)/3;TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;TIM_OC4Init(TIM3,&TIM_OCInitStructure);//使能PWMTIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
}

这里要注意一点,代码中的时钟跟引脚都是使用了宏定义的名称,按照个人的设备需要稍作修改。
大概说一下代码配置,38kz频率主要是以引脚PWM模式输出来实现,而且采用了IO口的引脚复用功能,不懂什么是复用功能的同学自行百度一下,配置GPIO时引脚功能选择为复用功能,即
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF
不同于M3、M4的配置的是,M3、M4需要使能复用时钟,然而M0的库函数却始终找不到复用时钟的宏定义,取而代之的是一个引脚复用配置函数
GPIO_PinAFConfig(Infrared_GPIO_PORT,GPIO_PinSource1,GPIO_AF_1)
最后一个参数 GPIO_AF_1 需要对照stm32f030芯片手册的引脚复用表做相应配置
~M0的手册真心不好找~

由上表可见,PB1的TIM3_CH4复用功能是对应AF1列,相应的要复用定时器14的话就是AF0了
接着,定时器配置,设置自动重装载计数值为 (SystemCoreClock/38000)-1 以确保38kHz的波形可以产生
TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock/38000)-1
配置引脚PWM模式,TIM_Pulse 用来配置占空比的大小,需要注意的是 TIM_OC4Init()TIM_OC4PreloadConfig()这两个函数,用的是定时器的第几通道的函数名都是不一样的,程序中用的第4通道,所以函数名都是TIM_OC4InitTIM_OC4PreloadConfig 如果用的第1通道就是TIM_OC1InitTIM_OC1PreloadConfig 以此类推。
配置好在main函数中初始化,然后就可以用示波器看到一个接近完美的波形啦 ~

Cortex-M0系列 ~ 红外调制38kHz输出相关推荐

  1. 基于Cortex M0+的STM32L0系列简介

    L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...

  2. 32位ARM®Cortex®-M0+内核单片机 XL32F003系列MCU

    XL32F003系列微控制器采用高性能的32位ARM®Cortex®-M0+内核,宽电压工作范围的MCU.嵌入高达64 Kbytes flash和8 Kbytes SRAM存储器,最高工作频率32 M ...

  3. 新塘系列linux_身边的新塘+M0系列总结

    本帖最后由 Ketose 于 2017-4-21 16:55 编辑 NUC1xx系列是32位的内嵌ARM Cortex-M0核的微控制器 ,适用于工业控制和需要丰富的通信接口的应用领域.ARM Cor ...

  4. 关于红外调制基础理解

    关于红外调制基础理解 (2011-10-31 20:01:33)转载▼ 标签: 杂谈 分类: 智能协议无线 要是自己做红外遥控器的话应该怎么做?自己定义一个协议或套用现成协议,但是不管什么协议,对于红 ...

  5. 新唐ARM®Cortex™-M0特点总结

    ARM®CortexTM-M0特点: 主频50mhz主频,0.9DMIPS/MHz(相当于8位和16位产品的2-4倍) 小的处理内核,系统和存储器,可以降低器件成本 完善的电源管理(睡眠,深度睡眠和深 ...

  6. hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因

    凡是在Cortex M系列内核上写过程序的程序员, 没有不知道Hard Fault的. 大多数程序出现问题的表现就是进入Hard Fault. 但是进入Hard Fault的原因是甚么, 为了查明这个 ...

  7. armv7 cortex a系列编程手册_STM32、Cortex-M3和ARMv8-M之间的关联

    大家都应该知道STM32.Cortex-M3.ARMv8-M与ARM有关,但可能分不清他们是什么关系,或者具体是什么东西. 嵌入式开发直播课 - STM32 USART串口的应用 - 创客学院直播室​ ...

  8. 32 位 ARM® Cortex®-M0+内核 单片机

    PY32F003 系列微控制器采用高性能的 32 位 ARM® Cortex®-M0+内核,宽电压工作范围的 MCU.嵌入高达 32Kbytes flash 和 4Kbytes SRAM 存储器,最高 ...

  9. 如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M7系列MCU进行SWD接口调试

    该篇幅介绍如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M系列MCU进行SWD接口调试? 如何连接FT2232HL Debuger Adapter和目标板的的SWD调 ...

最新文章

  1. 微信小程序 - 关闭当前页面无法再通过左上角返回
  2. Spring Security 实战:基于配置的接口角色访问控制
  3. Spring(5)——Spring 和数据库编程
  4. 出路在哪里?出路在于思路!智者无敌
  5. 【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数
  6. linux perl 单例模式,Perl脚本学习经验(三)--Perl中ftp的使用
  7. android beaglebone,Android Based Beaglebone Spybot
  8. 一款“灵动”的滑动按钮
  9. ASP.NET2.0中的App_Data文件的作用
  10. ostringstream使用
  11. 三星android p内测,两年前老机重生!三星开启Galaxy C9 Pro升级安卓8.0内测
  12. java实现控制台表格
  13. C# Socket/TCPClient断线重连/不断重连的简单思路+代码,海量注释
  14. 嵌入式应该怎么去学?-熊健-专题视频课程
  15. 人工智能课程设计——八皇后问题的求解算法比较
  16. java读取xslx内容,内容转换成docx和pdf,包括图片
  17. 得物技术Filament Creator材质编辑工具的实现
  18. m4v如何转换成mp4?用视频转换器转换很简单
  19. 【短视频运营】短视频剪辑 ① ( 下载软件 | 安装软件 | 简单使用 )
  20. Markdown 15 款顶级笔记软件测评推荐

热门文章

  1. 每日互动方毅:数据可用不可拥,让数据价值流转数据不流转|爱分析访谈
  2. Welcome to MySQL Workbench:MySQL 事务
  3. 用android代码实现一个可以万能播放器
  4. Javascript基础(四):获得焦点和失去焦点事件
  5. return 的用法
  6. C#将数值转为添加千位分隔符
  7. 扫描线Sweep Line算法总结
  8. linux12企业实战 -- 12ubuntu部署K8s集群
  9. asmlinkage
  10. js的对象和java的类的简单区别