历史上的今天
今天是:2025年06月27日(星期五)
2019年06月27日 | 基于STM32的学习型通用红外遥控设备的设计实现
2019-06-27 来源:eefocus
CPU: STM32
调试平台: STM32F103ZET和STM32F103VBT
软件平台: Keil uVision4
电路设计: Altium Designer v6.9
二、学习型红外遥控设备的各个模块实现
2.4 红外脉宽存储及FLASH的读写
根据STM32型号的不同,FLASH容量由16K到1024K不等。
FLASH模块主要由三部分组成:主存储器、信息块、闪存存储器接口寄存器。FLASH模块组织:

详细内容见《STM32中文参考手册》小节《2.3.3 嵌入式闪存》。
主存储器用来存放代码和数据常数,对于大容量产品,划分为256页,每页2K字节;中小容量产品每页则是1K。信息块的启动程序代码用来存储ST自带的启动程序,用于串口下载,用户选择字节一般用来配置写保护、读保护。闪存存储器接口寄存器是整个闪存模块的控制机构,控制闪存的读写。
FLASH可以在通用地址空间直接寻址,任意32位数据的读操作都能访问FLASH内容,得到相应数据。FLASH的最快访问速度≤24MHz,如果CPU频率超过24MHz,必须加入等待时间。对于72MHz的主频,FLASH的等待周期必须设置为2。
FLASH的编程和擦除。STM32的FLASH编程由FPEC模块操作,在系统复位后,FPEC模块会被保护起来,不能写入。只有写入特定的序列到FLASH_KEYR寄存器打开FPEC模块解除写保护后才能操作相关寄存器。
注意:STM32闪存编程每次必须写入16位的数据,且要求写入地址的FLASH已经擦除,否则写入无效。
在指定地址写入指定个数的数据,操作流程图如下图所示:

示例代码见附件。
使用硬件仿真功能测试数据的读写是否正确。在Debug模式下,单步执行写数据函数FLASH_WriteData()和读数据函数FLASH_ReadData(),写入和读出的数据如下图所示:

2.5 中断方式实现的学习按键
学习按键的程序用外部中断的中断线2实现。
示例代码见附件。
2.6 红外信号的调制发送
由于学习是对红外脉冲的完整复制,故发送只需把FLASH里的红外数据取出调制到载波上发送出去即可,实现流程图如下图所示:

示例代码如下:
/**
* SendPort_Init(void) 红外发送端口控制初始化
*/
void SendPort_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/** 使能PD端口时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/** 使能PD端口配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3; //LED0-->PF6~~~PF10 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2); // PD0~~~PD2输出高
GPIO_ResetBits(GPIOD, GPIO_Pin_3); // 注意!!!!!!!!!!!!
}
/**
* 示波器接收的键码 52: 0101 0010
* 单片机接收的键码 4A: 0100 1010
* 发送的键码 4A: 0100 1010
* 验证平台: 长虹电视机、单片机
* 验证通过: 电视机可接收
*/
u16 sendCode[200] = {0};
void IR_SendData(u32 SendAddr)
{
u8 i;
#if 0
u16 sendCode[200] = {0};
// 已通过验证
for(i=0; i<199; i++){
sendCode[i] = PulseTab[i];
}
#endif
FLASH_ReadData(SendAddr,sendCode,200); // 从相应FLASH地址取出数据
for (i=0; i<100; i++) {
if ((sendCode[2*i]!=0) && (sendCode[2*i+1]!=0)) {
IR_SEND = 0;
delay_us(sendCode[2*i]);
IR_SEND = 1;
delay_us(sendCode[2*i+1]);
}
}
// IR_SEND = 0;
/** 下面两句及其重要,否则出错!!! */
// delay_us(555);
IR_SEND = 1;
}
遥控器减号键如下图所示:

2.7 TFT显示模块
TFT是Thin Film Transistor(薄膜场效应晶体管)的简称,这种液晶显示器上的每一像素点都由集成在后面的薄膜场效应晶体管驱动。故而这种显示器速度快、亮度高、对比度高,分辨率也较其他类型的液晶显示器高。
TFT液晶的驱动时序如下图所示:

3 整个系统
整个系统完整的程序见附件(为减小文件,删除了一些编译时产生的文件,故工程需要重新编译)
系统实物图

参考文献
[1] 廖义奎编著. Cortex-M3之STM32嵌入式系统设计. 北京: 中国电力出版社,2012.
[2] 张彬杰. 22个元件做出学习型遥控器[J]. 无线电, 2010(08):79-82.
[3] 意法半导体(中国)投资有限公司. STM32中文参考手册. 2010.
史海拾趣
|
记得从什么时候开始,热分析意味着撤回原型并确定是否需要额外加入两个散热片和一个风扇吗?现在再尝试这种方式你将发现身处泥潭却无计可逃。毕竟,热可能会影响电气性能并最终缩短平均无故障时间。 回顾我年富力强的工程时代,我在热分析上 ...… 查看全部问答> |
|
PWR_IST: pPWR->State = 0x2 PMGET! System Power state is \'on\', flags 0x00010000 >>>>>>>>>>>>>>>>>>> state == on POWER_STATE_SUSPEND … 查看全部问答> |
|
我已做了半年的VXWORKS嵌入式系统上层应用程序,现在开始做系统了,对于BOOTROM\\系统移植都是些很概念性的东西!目前印制板已经完成了!我现在手上有,BOOTROM和BSP以及开发环境都已经搭好, 现在我该怎么做才能让我的系统在板子上跑起来呢? 请各位指 ...… 查看全部问答> |
|
我 想 从文件 加载 ico 图片 用了SHLoadImageFile 函数 GetlastErr 是6 总是 加载不上 另外我也用了 LoadImage 报 1814 的错 现在不知道 怎么 弄了 请各位大侠 指点一下 &nbs ...… 查看全部问答> |
|
都说三极管是流控器件,基极电流控制集电极电流,可是基极电流也是由加在基极上的电压来确定的,这个,为什么非要说成是流控元器件呢,说成压控元器件,应该也是可以的吧?求教。。。… 查看全部问答> |




