wenyangzeng ARM DIY进程贴 红外解码
1、GPIO EXTI中断
2、LCD I/O 3.3V驱动5V LCD
3、超声波测距
4、ADC
5、RTC
6、USART
7、I2C
8、SD卡读FAT文件
9、三相正弦波发生器
10、CAN双机通信
11、USB虚拟鼠标
12、USB虚拟串口
13、读取CPU唯一码
14、USB读卡器
15、uCOS-II移植
16、以太网
17、DAC
18、RC5格式红外遥控解码
19、DIY过程经验分享
开贴:硬件篇
ARM开发板DIY终于开始动手开工了。购到基础包后,找了一片PC机废主板。那些0602封装的电阻和电容大部分都找到了,只是10uF无极性电容是1206封装的。DIY板上有的设计成0805封装,有的是0602封装。使之有点不方便,其实板上空间还很宽裕,把10uF电容画成1206封装的,会更方便DIY者。
焊接工具是一把外热式30W尖头电烙铁,把STM32F103ZET6在板上位置摆正,在对角引脚各焊上一点焊锡固定住芯片,然后用烙铁头将焊锡丝拖焊过芯片四周引脚,出现连焊的引脚用屏蔽线的屏蔽层铜丝吸干净。焊接效果感觉还不错,见上传图片。我拿到的STM32F103ZET6是没有防静电包装的,估计商家将片子暴露在空气中许久,引脚有的已经氧化发黑,在照片中我保留下左下角发黑的引脚不作处理清理。
板上那只32K晶振如果能设计成卧式安装,可以避免容易折断引脚的毛病,同时晶振外壳能接地,可靠性会更好。
关键词: wenyangzeng 进程 红外 解码
花了半天时间检查PCB板和MCU引脚焊点,没有发现异常。将商家发错封装的3.3V稳压IC拆下,3.3V供电端对地电阻上升到5.8KΩ,测量稳压IC的1-2端阻值为350Ω,这两端就是3.3V输出端,如此低的电阻要消耗掉近10mA空载电流。当MCU进入睡眠状态时,整机耗电还是要达到10mA的。找了1只原装AMS1117测量,其1-2端阻值竟达到78KΩ,赶紧换上新的IC。通电,一切正常。
我用的编译环境是KEIL4.12,STM32的库是3.5版,下载工具是J-LINK。赶紧试看看下载跑马灯例程到芯片中能否成功--一切正常。至此,ARM DIY的硬件工作基本告一段落。
ARM DIY进程:GPIO的练习内容(以库操作方式):
1、配置CPU工作频率;
2、配置GPIO的输入或输出功能;
3、以位操作方式控制流水灯的亮灭;
4、以外部中断方式控制流水灯的闪烁花样。
如果照搬示范例程代码玩一玩跑马灯,并未真正学习到如何用库操作方式来操作相关的寄存器。本练习将DIY板上的轻触开关S2作为控制键,以中断方式来控制跑马灯闪烁的花样,从中学习到EXTI中断的操作技巧。从原理图上可知S2接GPIOC的I/O口13,故设GPIOC_PIN13为上拉输入,外部中断模式,下降沿触发中断,连接到13号中断线,中断入口为EXTI15_10_IRQn。过程需要对配置系统时钟,开放APB2相关总线,对NVIC、GPIO、RCC等寄存器进行操作,还要修改Stm32f10x_it.c文件里头关于EXTI15_10_IRQn入口函数的内容修改。在整个过程中学到了很多有用的基础知识。
在程序调试过程中刚开始找不到EXTI中断入口函数在哪里,也不知道Pin_13对应的中断入口函数是在EXTI15_10_IRQn,所以进入不了EXTI中断函数。后来通过认真查阅ST相关资料,理解清楚工作原理后,终于能进入EXTI中断函数。接下来又遇到进入中断后,尽管及时清除了中断标志位,在没有继续按键的情况下,程序则一直进入EXTI中断,根本无法去控制跑马灯的正常工作。只能再查阅相关资料和示范例程,弄明白这与开放APB2的相关寄存器有关,终于完成程序的调试。
程序演示如果拍照片要很多幅图片,就不上传了,闪烁逻辑图见下表:
主函数代码:
#include "stm32f10x.h"
#define LED1_ON GPIO_ResetBits(GPIOE, GPIO_Pin_2)
#define LED1_OFF GPIO_SetBits(GPIOE, GPIO_Pin_2)
#define LED2_ON GPIO_ResetBits(GPIOE, GPIO_Pin_3)
#define LED2_OFF GPIO_SetBits(GPIOE, GPIO_Pin_3)
#define LED3_ON GPIO_ResetBits(GPIOE, GPIO_Pin_4)
#define LED3_OFF GPIO_SetBits(GPIOE, GPIO_Pin_4)
#define LED4_ON GPIO_ResetBits(GPIOE, GPIO_Pin_5)
#define LED4_OFF GPIO_SetBits(GPIOE, GPIO_Pin_5)
u16 Count=0;
RCC_ClocksTypeDef RCC_ClockFreq;
void Delay(u16 speed)
{
u16 i;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}
int main(void)
{ u16 speed=2000;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
SystemInit();
RCC_GetClocksFreq(&RCC_ClockFreq);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
// PE2,3,4,5输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOE, &GPIO_InitStructure);
//PC13上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 连接IO口到中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
while (1)
{ switch(Count)
{
case 0:
{
LED1_ON;
Delay(speed);
LED1_OFF;
LED2_ON;
Delay(speed);
LED2_OFF;
LED3_ON;
Delay(speed);
LED3_OFF;
LED4_ON;
Delay(speed);
LED4_OFF;
Delay(speed);
break;
}
case 1:
{ LED1_ON;
LED2_OFF;
LED3_OFF;
LED4_OFF;
break;
}
case 2:
{ LED1_ON;
LED2_ON;
LED3_OFF;
LED4_OFF;
break;
}
case 3:
{ LED1_ON;
LED2_ON;
LED3_ON;
LED4_OFF;
break;
}
case 4:
{ LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
break;
}
case 5:
{ LED1_OFF;
LED2_ON;
LED3_ON;
LED4_ON;
break;
}
case 6:
{ LED1_OFF;
LED2_OFF;
LED3_ON;
LED4_ON;
break;
}
case 7:
{ LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_ON;
break;
}
}
}
}
EXTI函数代码
/*******************************************************************************
* Function Name : EXTI15_10_IRQHandler
* Description : This function handles External lines 15 to 10 interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{ EXTI_ClearITPendingBit(EXTI_Line13);
Count++;
if(Count==8)Count=0;
Delay(100);
}
}
回复
有奖活动 | |
---|---|
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! |
打赏帖 | |
---|---|
如何实现基于NXPiMX.RT1021的BH1730采集被打赏50分 | |
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 | |
【换取手持数字示波器】+点亮WS2812RGB灯被打赏50分 |