当前位置:首页 > STM32
  • STM32模拟 IIC

    #ifndef __AT24C02_H__ #define __AT24C02_H__ #include"stm32f10x.h" void iicinit(void); void iicwrite(u8 add,u8 Achar); u8 iicread(u8 add); #endif #include"stm32f10x.h" #include"at24c02.h" void iicstart(void); void iicstop(void); void ack(void); void iicwritebyte(u8 a); u8 iicreadbyte(void); void iicwrite(u8 add,u8 Achar); u8 iicread(u8 add); void iicinit(void); ///////////////////////////// void delay5us(void)//ums { unsigned short i, j; unsigned short time; time=5; for(; time > 0; time--){ for(j = 0; j < 5; j++){ for(i = 0; i < 1; i++); } } } void delayms(unsigned short time)//nms { unsigned short i, j; for(; time > 0; time--){ for(j = 0; j < 10; j++){ for(i = 0; i < 1004; i++); } } } void iicinit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); } void iicstart(void) { GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1; delay5us(); GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1; delay5us(); GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0; delay5us(); } void iicstop(void) { GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0; delay5us(); GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1; delay5us(); GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1; delay5us(); } void ack(void) { u16 i; GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1; delay5us(); while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)&&(i<0x2b0)) {i++;} GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0; delay5us(); } void iicwritebyte(u8 a) { u16 i; GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0; delay5us(); for(i=0;i<8;i++) { if(a&0x80) GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1; else GPIO_ResetBits(GPIOB,GPIO_Pin_7);; a=a<<1; GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1; delay5us(); GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0; delay5us(); } GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1; delay5us(); } u8 iicreadbyte() { u8 i,temp; temp=0; GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1; delay5us(); GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0; delay5us(); for(i=0;i<8;i++) { GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1; delay5us(); delay5us(); temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7); delay5us(); GPIO_ResetBits(GPIOB,GPIO_Pin_6); //scl=0; delay5us(); } GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1; delay5us(); GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0; delay5us(); return temp; } void iicwrite(u8 add,u8 Achar) { iicstart(); iicwritebyte(0xa0); ack(); iicwritebyte(add); ack(); iicwritebyte(Achar); ack(); iicstop(); delayms(20); } u8 iicread(u8 add) { u8 temp; iicstart(); iicwritebyte(0xa0); ack(); iicwritebyte(add); ack(); iicstart(); iicwritebyte(0xa1); ack(); temp=iicreadbyte(); ack(); iicstop(); return temp; }

    时间:2012-09-08 关键词: iic STM32 设计教程

  • STM32学习笔记之IAR下建立FWlib 3.0项目

    开发工具:JLink V7.0 开发环境:IAR5.3 第一步:下载函数库 从ST官方网站(http://www.st.com/stonline/products/support/micro/files/um0427.zip)下载STM32 V3.0固件函数库。 第二步:复制库文件 将下载的软硬件函数库解压后,将目录中的【Libraries】目录拷贝到您的项目目录中,然后【Project】目录下的【Template】目录下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四个文件拷贝到您的目录下,然后将【Project】——【Template】——【EWARMv5】目录下的四个加载镜象文件复制到您的止录下。所以这些完成后您的项目中的文件差不多如下图所示了:     第三步:加载文件 启动IAR5.3开发环境,选择在当前工作空间建立新项目,将提示工具选择,选择ARM即可;项目模板选择,直接选择空项目即可选择完毕后单击OK按钮,提示项目文件存放位置,直接存到之前新建的项目目录中即可。然后按下图所示添加各文件组,并将相应的文件添加进去就可以了。     第四步:配置IAR 5.3 右击项目文件(比如上图中的MyProject - Debug),选择右击菜单中的【Options】按钮,将出现项目配置选项卡。选择【General Options】,在【Target】页中选择【Device】,再点击【Device】右侧的器件选择按钮,选择您的STM32芯片。选择完毕后将如下图所示:     选择【C/C++ Compiler】,再选择【Preprocessor】页在【Additional include directories】的文本框中,输入您的项目所需索引的头文件地址,配置完成后,将如下图所示:     选择【Linker】,再选择【Config】页,将【Override Default】复选框选中,单击文本框右侧的文件选择按钮,在您的项目根目录中选择您要连接配置的文件(比如您准备将程序在Flash中运行,则选择stm32f10x_flash.icf),配置完成后,将如下图所示:     选择【Debugger】,再选择【Setup】页,在【Driver】下拉选择框中选择【J-Link/J-Trace】, 配置完成后,将如下图所示:     完成以后操作后,点击Make命令按钮,提示保存Workspace file,输入您要保存的名称(比如就上面的项目就取名为MyProject),点击保存后,系统进行编译。编译后将提示Warning[Pe223]: function "assert_param" declared implicitly 警告,这是因为没有申明stm32f10x_conf.h文件的原故,在main.c的头文件中申明一下就可以了。 通过以上四步,您就可以使用IAR建立一个您自己想要的项目了,不过在IAR配置介绍中,我只是做了一个最基本的配置介绍,读者如果想了解更多IAR的环境使用说明,可以直接参考IAR的帮助文件进行学习深入。文中如有不明之处,还希望各位朋友不吝提出。非常感谢!!

    时间:2012-09-09 关键词: 项目 3.0 iar STM32 习笔记 设计教程 fwlib

  • 使用STM32的PWM输入功能计算输入PWM的周期

    1、时钟部分,TIMER2的时钟频率,我是初始化为36M. RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟=系统时钟/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 倍频系数为9 PLLCLK="8"*9=72 2、TIMER初始化 TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 18; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式为从模式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //使能主从模式 TIM_Cmd(TIM2, ENABLE); //使能TIM2计数器 TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //使能CC2中断请求 3、TIMER中断处理 void TIM2_IRQHandler(void) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); /* Get the Input Capture value */ IC2_Value = TIM_GetCapture2(TIM2); } 注意事项: 不知道为什么,STM32的TIMER时钟经过分频率后,时钟的精度误差会随分频值变大而变大。在不分频的情况下,我检测1KHz的PWM输入信号,误差为0.5us。在18分频的情况下,误差已经不能看了。测量100Hz,根据捕获值计算出来却是105Hz。 确实如STM32朋友所讲,在分频处我理解错了,分频值=TIM_TimeBaseStructure.TIM_Prescaler +1,所以如果要分18分频,只要将TIM_Prescaler=17即可。经这样修改后测量误差在万分之5以内。谢谢STM32朋友的提醒!!(上面的误解我就不删除了,留做以后警记,呵呵!)

    时间:2012-09-09 关键词: STM32 pwm 周期 设计教程

  • ulink-Jlink下在ram和flash中调试STM32的方法

    Keil MDK3.20 在ULINK下调试stm32方法 1. 程序在RAM中运行 要点:(1)程序的下载地址改到RAM空间中 (2)程序的debug之前要设定SP,PC指针到Ram空间 新建工程,选择STM32 的具体型号,我买的万利的开发板,选择stm32f103Vb。   ?   设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。   ?   空间大小如何分配取决于自己的需求。本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。 Debug标签选择ULINK1 Cortex Debugger(软件采用yjgyiysbcc兄crack方法)。不选Load Application at Start,在Initialization中加入启动脚本RAM.ini。   ?   RAM.ini中具体内容如下: FUNC void Setup (void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register } LOAD XXX.axf INCREMENTAL // Download,红色代表工程文件名.axf Setup(); // Setup for Running g, main Utilities下Update Target before Debugging不选 这样添加后就可以在RAM中调试了。 >>>>>>我们需要在代码中设置正确的中断向量表位置。中断向量表通常被放置在用户程序的开始,所以flash中运行时,向量表位于0x08000000处,而当代码被放置在SRAM中运行时,他的位置就成了0x20000000。在初始化NVIC时,我们可以放置如下代码,定义向量表的位置 NVIC_SetVectorTable(0x20000000 , 0x0); 或 NVIC_SetVectorTable(0x08000000 , 0x0); 或 ?   >>>>>工程选项中Debug项,Download选项卡中,去掉所有钩子,不下载代码到flash,这样就可以在RAM中调试程序了! 2. Flash中调试 新建工程后系统默认设定好IROM1为FLASH的地址和空间大小。只需要两步: 1) 设定调试工具为ULINK1 CORTEX DEBUGGER,如下图所示,不需要设定起始脚本。   ?   2) 在Utility中设定选择ULINK1 cortex debugger,并设定编程算法。如下图所示。   ?     ?   之后就可以FLASH调试了。 硬件:万利的 EK-STM32F开发板,硬件去掉RS3,RS4 排阻,断开开发板本身的仿真器。 软件:KEIL MDK3.20+ULINK驱动替换文件。 仿真器:ULINK

    时间:2012-09-09 关键词: 方法 Flash STM32 RAM jlink ulink 设计教程

  • STM32进入和退出睡眠模式例程

    1设计要求 要求系统按如下方式进入和退出睡眠模式: 在系统启动2秒后,将RTC在3秒钟之后配置为产生一个报警事件,接着通过WFI指令使系统进入停机 模式。如果要唤醒系统到正常模式,可通过按Key按钮;否则,在3秒钟后,会产生RTC报警中断自动 将系统唤醒。一旦退出停机模式,系统时钟被配置成先前的状态(在停机模式下,外部高速振荡器 HSE和PLL是不可用的)。经过一段延时之后,系统将再次进入停机状态,并可按上述操作无限重复。 2 硬件电路设计 硬件电路采用与7.1小节应用实例一样硬件电路,可见图7-10。其中Key按钮用于通过PB9产生一个外 部中断,LED1、LED2、LED3、LED4则用于显示处理器所处的模式和中断触发情况。 3 软件程序设计 根据任务要求,程序内容主要包括: (1) 配置GPIOB口,配置RTC,配置外部中断; (2) 配置PB口第9个引脚作为外部中断,下降延触发;配置RTC报警中断,上升沿触发; (3) 两个中断服务子程序的内容分别是:切换LED2和LED3灯的状态; 整个工程包含3个源文件:STM32F10x.s、stm32f10x_it.c和main.c,其中STM32F10x.s为启动代码, 所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main.c中。下面分别介绍相关的函数, 具体程序清单见参考程序。 函数SYSCLKConfig_STOP用于当处理器从停机模式唤醒之后,配置系统时钟、使能HSE和PLL,并以 PLL作为系统时钟源。当处理器处理停机模式的时候,HSE、PLL是不可用的。 函数GPIO_Configuration用于配置GPIO的PC6、PC7、PC8、PC9和PB9。 函数EXTI_Configuration用于配置外部中断线9(PB9)和17(RTC报警)。 函数NVIC_Configuration配置NVIC及中断向量表,这里主要是配置外部中断线9和17。 函数EXTI9_5_IRQHandler处理按钮Key(PB9)所触发的中断,其主要作用是将LED2灯的状态翻转一次。 函数RTCAlarm_IRQHandler处理RTC报警所触发的中断,其主要作用事将LED3 灯的状态翻转一次, 如果设置了唤醒标志则清除之。 运行过程: (1) 使用Keil uVision3 通过ULINK 2仿真器连接实验板,打开实验例程目录PWR_TEST子目录下的PWR.Uv2例程,编译链接工程; (2) 选择软件调试模式,点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,在逻辑分析仪中添加GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9,点击Run按钮即可,在逻辑分析仪中看到如图7-14,还可用Peripherals-General Port-GPIOB来模拟KEY按钮的动作; (3) 选择硬件调试模式,选择Start/Stop Debug Session项或Ctrl+F5键,下载程序并运行,观察LED灯的变化情况。注意,当目标系统进入停机模式之后,将无法使用仿真器进行调试了; (4) 退出Debug模式,打开Flash菜单>Download,将程序下载到开发板的Flash中,按RESET键复位,观察LED灯的情况,正常情况应为:系统处于运行模式时LED1亮、LED4灭;系统处于停机状态时LED1灭、LED4亮;当按下KEY按钮时LED2灯状态发生反转;当发生RTC报警时LED3状态发生反转。

    时间:2012-10-20 关键词: STM32 设计教程

  • ST MP34DT01和STM32数字MEMS麦克风解决方案

    ST 公司的MP34DT01是超小型低功耗全方位数字MEMS麦克风,具有容性传感元件和IC接口,单电源工作,声学过载点120 dBSPL,信噪比63dB,全方位灵敏度,灵敏度-26dBFC,PDM输出,主要用在手机,笔记本电脑,手持媒体播放器(PMP),VoIP,语音识别,数码相机和摄像机,防盗系统等.本文介绍了MP34DT01主要特性,以及采用MP34DT01和STM32 MCU的STEVAL-MKI117V1演示板主要特性,电路图,材料清单和PCB布局图. The MP34DT01 is an ultra-compact, low-power,omnidirectional, digital MEMS microphone built with a capacitive sensing element and an IC interface. The sensing element, capable of detecting acoustic waves, is manufactured using a specialized silicon micromachining process dedicated to produce audio sensors. The IC interface is manufactured using a CMOS process that allows designing a dedicated circuit able to provide a digital signal externally in PDM format. The MP34DT01 has an acoustic overload point of 120 dBSPL with a 63 dB signal-to-noise ratio and –26 dBFS sensitivity. The MP34DT01 is available in a top-port, SMDcompliant, EMI-shielded package and is guaranteed to operate over an extended temperature range from -30℃ to +70℃. MP34DT01主要特性: ■ Single supply voltage ■ Low power consumption ■ 120 dBSPL acoustic overload point ■ 63 dB signal-to-noise ratio ■ Omnidirectional sensitivity ■ –26 dBFS sensitivity ■ PDM output ■ HCLGA package – Top-port design SMD-compliant – EMI-shielded – ECOPACK® , RoHS, and “Green” compliant MP34DT01应用: ■ Mobile terminals ■ Laptop and notebook computers ■ Portable media players ■ VoIP ■ Speech recognition ■ A/V eLearning devices ■ Gaming and virtual reality input devices ■ Digital still and video cameras ■ Antitheft systems MEMS microphone demonstration board based on the MP34DT01 and STM32 The purpose of the STEVAL-MKI117V1 demonstration board is to provide an example of the decoding and streaming of digital MEMS microphone outputs. The STEVAL-MKI117V1 demonstration board hosts the MP34DT01 (bottom-port digital microphone), working as a sensor, and the STM32F107RC microcontroller, working as an audio decoder. These microphones are analog-to-digital transducers. They are able to sense sound pressure and convert this signal into a digital signal using the PDM technique. The STM32 microcontroller decodes the PDM signal coming from the microphones and streams the audio via the USB. The STEVAL-MKI117V1 demonstration board is a sound card automatically recognized by the PC as an audio device. Connection is made through a USB cable which also supplies the board and then streams the collected audio. STEVAL-MKI117V1演示板主要特性: ■ Powered and connected to PC through USB ■ Sound card automatically recognized by the PC as an audio device ■ The onboard microphones are digital MEMS devices ■ MEMS microphones provide a high frequency data stream (1 to 3.25 MHz) of 1-bit digital samples (PDM technique) ■ Audio collected from the microphones is sent to the PC through the USB ■ LED status indicator ■ RoHS compliant     图1.STEVAL-MKI117V1演示板外形图:左,顶视图,右,底视图     图2.STEVAL-MKI117V1演示板电路图(1)     图3.STEVAL-MKI117V1演示板电路图(2) STEVAL-MKI117V1演示板材料清单:             图4.STEVAL-MKI117V1演示板PCB布局图:顶层     图5.STEVAL-MKI117V1演示板PCB布局图:底层

    时间:2012-10-20 关键词: 方案 mems st 麦克风 STM32 解决 设计教程 mp34dt01

  • [STM32]GPIO跑马灯实验(环境配置篇)

    在开始软件实验之前,先看下硬件的设置。 (不能看他的用户手册,用户手册居然能错,真服了,把用户手册的LD各减去1) LD1 --> PC7 LD2 --> PC6 LD3 --> PC5 LD4 --> PC4 开发板上的PortC上面的Pin7,Pin6,Pin5,Pin4分别对应LD1,2,3,4。STM32的 GPIO端口可直接驱动 LED 发光管。GPIO管脚输出高电平,LED亮,输出低电平,LED灭。 工程目录结构: ├─library(stm32 库文件) │ ├─src │ └─inc ├─src (放用户文件) └─settings 创建新工程,在工程右键->Add->Group,添加虚拟目录便于管理. STM32Lib和Src 把library文件的.c放进STM32Lib里面(右键该目录Add files选library里面的src的.c文件) 新建文件保存为main.c放到src文件夹下并添加到虚拟目录Src中。 修改工程的options General -> Target -> Device -> ST STM32F10x C/C++ -> Language选Relaxed ISO/AsSI, Plain 'char' is unsigned,预编译(Preprocessor)添加头文件所在位置 $PROJ_DIR$ $PROJ_DIR$src $PROJ_DIR$libraryinc $PROJ_DIR$librarysrc Liker->output -> Allow C-spy.... Extra output 勾选Generate extra output file, config下面overwrite default linker command files 到$PROJ_DIR$lnkarm_flash.xcl上面(把万利的例子里面的lnkarm_flash.xcl,和lnkarm_ram.xcl拷贝工程目录里就行了) Debugger -> setup -> driver -> third-party driver , Download选择use default loader Third-party driver->选择你的driver位置C:ManleyDriversSTLinkSTM32Driver.dll Project-》make,出错啦找不到#include "stm32f10x_conf.h" 把那个文件考过来吧stm32f10x_it.c,stm32f10x_conf.h都在例程的工程目录里 靠,还是不行。 Whyyyyyyyyyyyyyy? 原来是stm32f10x_conf.h 文件需要配置才可以 根据自己使用需求,打开相应外设的define:#define _PPP(必须的) #define _PPPx(可选的,根据外设决定) #define HSE_Value ((u32)8000000)根据自己电路板上的外部晶振频率来修改HSE_Value。万利板子是8MHz的。 就搞定了。 总结一下: 1.创建项目目录,拷贝公共文件 将STM32软件库中FWlib目录中的library目录拷贝到所建项目的目录中 将软件库的Examples目录里的任一例程的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h和main.c拷贝到项目的目录中。 拷贝软件库中projectEWARM目录中的stm32f10x_vector.c、cortexm3_macro.s、lnkarm_ram.xcl和lnkarm_flash.xcl到项目的目录中。 2. 修改设置文件stm32f10x_conf.h 根据自己使用需求,打开相应外设的define:#define _PPP (必须的) #define _PPPx (可选的,根据外设决定) 根据自己电路板上的外部晶振频率来修改HSE_Value 3. 修改自己的代码文件(main.c)包含#include “STM32F10x_lib.h“(必须的) 在main.c中编写自己的主程序,添加自己编写的代码。 4. 修改中断文件stm32f10x_it.c 根据开启的中断,在对应的中断函数中添加代码。原来的函数都是空的,添加你所需要的中断函数就行了 5. 创建一个新的项目 点击菜单File-->New-->Workspace创建一个新的工程 点击菜单Project--> Create New Project创建一个项目 保存项目到设定的项目根目录中 6. 添加文件 向项目中添加文件:根据stm32f10x_conf.h中打开的外设,向项目中添加对应的PPP.c文件 必须添加stm32f10x_lib.c 用户可以向项目中添加*.c文件;也可以添加代码组,然后将c文件添加到组里面:可以很好地进行源代码管理;有助于生成较好的目标代码。 7. Option设置 在项目名称上单击右键选择Option,或点击菜单Project-->Option。 General Option设置Taget --> Processor Variant选择ST系列芯片:ST STM32F10x, Endian mode选择:Little Stack align选择:4 bytes C/C++ Compile 设置Language选择你使用的语言选择使用语言的规范 Plain‘char’is:Signed表明使用char定义的变量为有符号的;Unsigned表明使用char定义的变量为有符号的。 C/C++ Compile -> Optimization 根据使用需求选择代码(Size)或运行速度(speed)优化:None(用于调试),Low,Medium,High(用户最终代码) C/C++ Compile设置Preprocessor, 设置*.h文件所在的位置 $PROJ_DIR$ 和$PROJ_DIR$Libraryinc注意这两个中间是回车换行,两行。 Linker设置:Output开启C-SPY调试器 Linker设置Extra Output 打开“Generate the object file”选项;(用于产生调试和目标) 根据需求选择生成的目标文件(默认为IAR调试文件simple-code。); Linker设置Config 打开Override default选项:如果在Flash中调试程序,设置lnkarm_flash.xcl;如果在RAM中调试程序,设置lnkarm_RAM.xcl;形式为:$PROJ_DIR$lnkarm_flash.xcl 设置时候注意:在进行该项设置时,请确认电路板上的Boot0和Boot1引脚的跳线连接是否正确! Debugger设置Setup, 开启该选择,可以设定调试起始点(默认为main开始); 选择使用的调试工具,我用的STLink-II,不在之列,我已经安装了其驱动,所以选择第三方驱动 Debugger设置Download 方式,已选择下载程序到Flash,必须开启Use flash loader(s),可选Verify download;已选择下载程序到RAM或使用模拟器:无需选择。如果程序已下载到Flash:开启Suppress download 8. 保存Workspace 保存工程文件到项目目录中 9. 编译项目 使用菜单Project-->Rebuild All编译项目 在Message窗口查看编译结果;如果有错误双击进行修改。 10. 调试 使用菜单Project-->Debug或单击Debug按钮进入调试状态 如果在Flash中调试程序时,出现下载进程对话框; 在工具栏出现使用菜单Debug中的调试菜单或工具条进行调试[!--empirenews.page--]

    时间:2012-12-10 关键词: STM32 gpio 设计教程 马灯实

  • 基于STM32单片机的火控系统信号采集测试

    火控系统是控制火炮瞄准和发射的系统,火控计算机是火控系统的核心,在完成火控解算进而引导高炮射击时具有重要作用。由于火控系统信号众多,状态复杂,对其关键信号的采集测试就显得尤为重要[1]. 普通信号采集测试装置具有结构复杂、造价昂贵、携带不便等特点,该方案结合最新型ARMv7系列STM32单片机,利用其丰富的外设接口和I/O资源,对某型火控系统的重点输出信号进行采集,存入板载Flash以备使用。另外,为便于使用和调试,还设计了CAN接口和RS-232串口。该信号采集盒大小为100 mm×65 mm,可由被测板提供电源信号,具有携带方便、使用简单的特点,对装备信号的实时采集具有重要的实用意义。 1总体设计方案 1.1总体设计框图 总体设计框图如图1所示,其中装备板是被测对象,STM32为控制核心,用于完成对各电路的控制,CAN总线用于与其他节点间的通信,RS-232串口用于调试及与LCD液晶屏通信。装备板被测信息分为模拟信号和数字信号,可向装备版提供5路数字控制信号,以模拟装备板的输入信号。     1.2 硬件设计 该方案的硬件组成主要包括:电源转换模块、微控制器模块、信号调理模块、CAN接口电路、Flash接口模块和信号显示模块等。 1.2.1 电源转换模块 被测装备板采用7.5 V~8 V电压供电,信号采集板需要3.3 V、5 V以及±12 V四种电压等级,因此需要将测试板载电压等级进行转换。5 V和3.3 V采用两片Alpha公司高性能、低功耗AS117电源转换模块;±12 V电压由两片输入输出隔离单输出DC/DC模块DLW02-05S12获得。经实验测试得知,用上述方法得到的电压纹波较小,电压幅值稳定,满足要求。 1.2.2 微控制器模块 微控制器采用基于Cortex-M3内核型号为STM32F-103R8单片机,最高频率可达72 MHz,具有性能强劲、代码密度高、位带操作、可嵌套中断、低成本和低功耗等众多优势。STM32拥有FSMC、TIMER、SPI、I2C、USB、CAN、I2S、SDIO、ADC、DAC、RTC和DMA等众多外设和功能,拥有优异的实时性能,可提供84个中断、16级可编程优先级,另外支持SWD和JTAG两种调试口,为设计带来很多方便[2]。 该微控制器带有的CAN接口,可方便本系统与其他节点互联,RS-232接口可用于调试及控制液晶显示模块,两路SPI接口可以完成MAX1270 A/D转换器的通信控制及Flash存储器的读写,众多的I/O端口可以方便其他功能扩展。 1.2.3 信号调理模块 火力控制板是某型火力控制系统的重要组成部分,其输出信号主要分为:8路模拟信号和8路输出信号。 (1) 数字信号调理电路 为了便于处理火力控制板输出的8路数字信号,在进入单片机前需要对其进行同步及电平转换。图2为数字信号同步及电平转换电路,主要器件为74HCT245。需要注意的是,在输入单片机时要对比其数据手册,选择具有FT(容忍5 V)标注的管脚,防止电平不兼容[3]。     (2) 模拟信号调理电路 图3为模拟信号调理电路,它将火控板输出的模拟信号进行滤波及放大处理。图中,电容用来滤除一些来自地端的高频串扰;R37为电位器,用于灵活调整信号输出大小;2 V稳压二极管用于保护运放LF412不被损坏。另外,LF412可使用双电压模式,且具有较高的转换速率,较为适合完成火控板上变化速率较快的信号处理工作。     1.2.4 CAN接口电路 控制器局域网CAN可以以最小的CPU符合来高效处理收到的大量报文,可用软件配置报文发送的优先级特性。图4为bxCAN模块,通过CAN总线收发器65HVD290可以完成自动接收和发送CAN报文,对标准标识符(11 bit)和扩展标识符(29 bit)完全支持[4]。通过CAN接口电路可以完成信号采集板与其他设备CAN网络节点的连通。     1.2.5 Flash接口电路 图5为Flash闪存接口电路,用于存放采集到的数据以及其他节点传送的信息。设计采用ST公司的M25P20闪存芯片,具有2MB存储空间,单片机通过SPI接口控制其读写过程,具有擦写速率快、寿命长等优点[5],可以较好地完成采集板数据高速存取。     1.2.6信号显示模块 液晶显示器(LCD)是提供友好人机界面、实现信息交互的关键器件,具有功耗低、体积小、显示效果好等相对于传统显示方式的优点[6].系统采用基于ARM920T内核的蓝海微芯7寸液晶屏,通过RS-232串口与STM32通信,完成信息显示工作。 1.3软件设计 STM32单片机使用Keil对其编程,使用J-Link下载器调试,下载采用JTAG方式,使用ST提供的库函数操作,非常方便。 1.3.1模拟信号数据采集子程序 模拟信号采集是通过美信MAX1270进行A/D转换实现的。A/D转换芯片MAX1270通过SPI接口与单片机通信。信号采集子程序流程图如图6所示,首先,对ADC进行初始化,进行采样时间、转换时钟的设定等;然后,启动ADC,对调理信号进行采集,任一时段采样结果为8次连续采样的平均值;A/D转换结束后,转入相应的中断服务程序,对采样得到的数据进行分析和处理。     1.3.2 数字信号数据采集子程序 数字信号的采集通过STM32的输入引脚完成。数字信号经过调理同步后可以对其进行实时捕获,通过读取各管脚状态获得采集值。另外,对于一些频率信号的采集,可以通过设定相应管脚的中断状态进行,在信号的上升沿时刻进行捕获。频率信号数据采集子程序流程如图7所示。     2 实验结果与分析 为了进一步检验采集板信号采集性能,利用C++ Builder设计了数据简易分析程序,用RS-232串口与上位机通信,实时显示采集到的数据,图8是提取的一组数据。 模拟通道采用直流27 V为测试源。由上图可知,采集值最小为26.93 V,采集误差仅为0.26%,可见对直流模拟信号采集误差较小,稳定性较高。 数字通道采用信号发生器产生1 kHz的测试源。由图8可知,采集值最小为996 Hz,误差为0.4%,满足需求,稳定性较高。 本文根据某火控系统检测需要,设计了一种基于STM32系列单片机的火力控制板信息采集测试方案,可作为控制器局域网CAN总线的一个节点与其他节点进行通信,设备体积小、操作简单、易于实现,且采集与测量精度较高,具有一定的使用价值。

    时间:2012-12-12 关键词: STM32 设计教程

  • 基于STM32微处理器的GPRS数据传输技术的研究

    STM32是意法半导体(ST)公司推出的基于ARM Cortex-M3内核的主流产品之一,它是ST公司专门针对要求高性能、低功耗和低成本的嵌入式应用而设计的,目前已在各领域得到广泛的应用。SIM900A是SIMCom公司主推的一款紧凑型的GSM/GPRS双频模块产品,它以性能稳定、外观精巧及性价比高的优点深受广大工程师青睐。  本文通过对STM32底层配置以及数据传输的研究,介绍STM32主要的底层配置,并着重介绍数据传输的实现。通过关键步骤的程序源代码的介绍,阐述实现数据传输的细节以及注意事项。该方法对其他项目或芯片有一定的实现价值和参考价值,且简单可靠,具有普遍性和通用性。 1 STM32底层配置  为了实现STM32单片机与SIM900A模块之间的数据命令的传输,本文以串口为例,先搭建开发平台,在工程中加入相应的库函数以及配置文件,然后配置时钟以及串口相应的输入输出GPIO接口。在配置的同时,需要针对自身的原理图进行编写,才能保证配置正确无误。这样,基本的开发平台就搭建起来了。 1.1 串口配置  在开发平台搭建起来之后,就可以对串口进行配置了。配置速率为115 200 b/s,字长为8 bit,1 bit停止位,串口模式为输入与输出模式,最后,初始化相对应的串口。初始化串口之后,打开串口的中断响应函数,即USART_ITConfig(USART2,USART_IT_RXNE,ENABLE)(以串口2为例),然后使能相对应的串口,这样串口函数就基本配置完成了。需要注意一点,有些程序可能在传输的时候出现首位丢失。这个问题涉及到USART的机制。硬件复位之后,USART的状态位是置位的(置1,表示已经发送完毕),而此时数据可以进行正常发送。当一帧数据发送后,由硬件将该位置位。而清除TC位(置0)是由软件来完成的,通过先读USART_SR,再写USART_DR将该位清除。但是程序在发送第一帧数据的时候,并没有进行读USART_SR,而是直接进行写USART_DR,因此TC标志位还是置1,并没有清除。当发送第一帧数据之后,用USART_GetFlagStatus()检测状态返回的是已经发送完毕,程序就会马上发送下一帧数据,因此第一帧数据就会被第二帧数据覆盖了,这样就看不到首位数据。根据这种情况,可以在每次传输之前或之后清除传输完成标志位,即USART_ClearFlag(USART2,USART_FLAG_TC)。 1.2 中断配置  配置完串口之后,将对NVIC进行配置。首次配置中断分组,然后选择串口的中断,即NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn(以所使用固件库的定义为主)。 再设置抢占式中断优先级和响应式中断优先级,然后使能中断和初始化。以上的配置必须结合自身的情况,设计出最优的中断分组和优先级,以保证程序响应中断的速度。中断后所做的内容在stm32f10x_it.c文件里配置,下文将会详细阐述。 2 实现细节  实现GPRS数据传输的原理是:STM32解析一串数据或命令,然后通过串口或其他方式一个字符一个字符地发送给SIM900A模块,SIM900A接收到数据之后再通过SIM卡发送到服务器。当SIM900A接收到数据时,立即响应中断,按照中断所设置的方式进行数据处理。此时,就需要通过发送检验和接收检验来控制数据的传输。 2.1发送检验  由于STM32逐个字符地将数据发送给SIM900A模块,因此必须保证数据的正确性与连贯性。如果在发送的时候响应中断或者进行任务调度,则发送将作废,从而导致程序出错,所以开发者必须警惕该类的错误出现。  发送数据或者命令的时候,可以将数据通过参数传给发送函数,由发送函数统一控制,发送完成之后再返回一个发送完成标志位,告知调用函数者发送已完成。源程序如下:  void USART_Send_Byte(char MyData){ //发送字符函数  USART_ClearFlag(USART2,USART_FLAG_TC);  //清除标志位,如上所述 USART_SendData(USART2,MyData);//发送数据 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待发送完成 } void USART_Send_Str(char*s){//发送字符串  int i;  int len = strlen(s)-1;//字符串长度 for(int i=0;i<len;i++) USART_Send_Byte(s[i]);//循环将字符串发送出去 if(s[i]==0x0a){//判断发送是否结束 SendCFFlag=TRUE; //如果为真,则发送完成标志位置为真 }else{ USART_Send_Byte(s[i]);//如果为假,则发送出去 } } 2.2 接收检验  当SIM900A有数据返回或者有数据通过SIM900A接收到下位机时,STM32会立即响应中断来接收数据。此时就要在中断函数中进行一系列处理。以SIM900A为例,SIM900A模块返回的命令都是以"r"+"n"+""结尾,因此检验传输结束可以根据它进行判断。在中断响应函数(即stm32f10x_it.c文件里)的USART2_IRQHandler函数可以设置如下: void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){ //将接收字符存入接收缓冲区RxBuffer RxBuffer[ReceCounter++]=(char)USART_ReceiveData(USART2); //判断是否接收结束 if(RxBuffer[ReceCounter]==′′&& RxBuffer[ReceCounter-1]==0x0A && RxBuffer[ReceCounter-2]==0x0D){ ReceCFFlag=TRUE;   } USART_ClearITPendingBit(USART2,USART_IT_RXNE); } }  该函数的基本思路是:将USART接收到的字符逐个存入缓冲区,然后判断缓冲区最后3个字符是否为SIM900A的结束标识符。如果为假,继续接收;如果为真,则将接收完成标识符置为真。当接收完成标识符为真时,说明接收完成,接下来就可以进行数据处理了。 2.3 命令函数实现方法  下面将以AT+CIPSEND为例,阐述发送数据的细节。通过初始化模块、开启网络、建立接入点和建立TCP连接之后,就可以开始发送数据。实现源代码如下: u8 GPRS_Send(void){ u8 i=0; u8*p; USART_SendToGPRS("AT+CIPSENDrn");//发送命令 Delay_ms(500);//延时500 ms p=LookFor_Str(RxBuffer,">"); //查找是否有">"符号,如果有,则可以发送数据 if(p!=0){ p=0; memset(RxBuffer,0,BufferSize);//清空接收缓冲区 USART_SendToGPRS(GPRSSendData);//发送数据 Delay_ms(500);  Delay_ms(500);  Delay_ms(500);  p=LookFor_Str(RxBuffer,"SEND OK"); if(p!=0){//判断是否发送成功 //发送成功操作  return 1; }else { //发送失败操作    return 0;   }    } }    该函数的基本思路是:首先发送命令,然后查找是否有“>”符号,如果有,则说明可以开始发送数据。一段延时之后查找接收缓冲区是否有“SEND OK”字眼,有则说明发送成功,没有则表示发送失败。可以根据判断作进一步的操作。命令的用法详见SIM900A配套的AT命令手册。有以下三点需要注意:  (1)在本文测试程序中需要先获取IP然后才能建立TCP连接,这是由SIM900A机制决定的。所以如果开发者不能建立TCP连接,除了测试网络是否正常、服务器是否正确配置之外,还需在程序中先获取IP,命令为AT+CIFSR。  (2)可以先获取SIM900A的状态,命令为AT+CIPSTATUS。根据状态来判定进行哪些操作,可以减少运行量,简化代码,从而减少运行时间,提高运行效率。详见SIM900A配套的AT命令手册。  (3)延时的设定需要具体问题具体分析。例如,初始化SIM900A模块的时候,只需延时500 ms,模块返回的信息就接收到了,而接收来自服务器的信息时,有时由于信号问题或者巨大的数据量可能要延时久一点,而此时就需要开发者自行进行测试。延时的准确设置,可以在保证数据正确性的同时减少延时时间,从而提高程序的运行效率。  本文通过对STM32微处理器串口的设置以及中断的配置来阐述STM32微处理器底层的配置,再通过SIM900A的发送和接收数据实现GPRS的数据传输技术,从而实现STM32微处理器接入互联网。在接收检验实现中,可以根据接收是否完成只作一次判断,从而减少中断运行时间。而SIM900A是GSM/GPRS双频模块,还可以实现通话、收发短信、HTTP及FTP传输等诸多功能,通过更深入的研究,可以最大限度地挖掘出该模块的实用价值,从而为电子产品提供更多的应用功能。  

    时间:2012-12-12 关键词: GPRS STM32 理器的 设计教程

  • 基于STM32的LF RFID识别系统设计

    射频识别技术(Radio Frequency Identification,RFID)是从八十年代起走向成熟的一项自动识别技术。RFID利用射频方式进行非接触双向通信,以达到识别目的并交换数据,主要通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的。 RFID技术在近年取得了长足的发展,目前已广泛应用的频段分布在LF、HF、UHF和徽波频段,各频段的RFID系统均有各自的优点和相应的应用范围。对于LF频段的RFID系统而言,最明显的优点在于拥有很好的穿透性能,如可穿透液体物质,建筑物,人体等,且各种动物体细胞和各种气体分子对LF频段的能量吸收很小。 可见LF RFID系统可以在需要良好穿透性,需要不间断长时间工作,以及存在较高危险性场合(如含爆炸性气体矿井)下良好工作。本文正是由于它的这些重要优点提出了一种基于STM32的LF RFID系统,并对该系统进了设计制作并测试。测试结果表明该系统具有实现简单、可靠性高等特点。 根据RFID系统原理,LF系统一般由以下3部分构成: 1)电子标签:应放置在要识别的物体上,在本设计研究主要采用工业生产中的标准125 kHz电子标签EM4100。其内置小型的ROM和整流电路,能实现应答器和阅读器的无接触工作。 2)阅读器:可以是读或写/读装置,取决于所使用结构和技术,主要起到读标签的作用。 3)天线:天线应放置在应答器和阅读器之间,它主要起到桥梁的沟通作用,不管是能量提供还是信息传送都要通过耦合元件来实现。 1 系统总体设计 本次设计以STM32作为控制模块的核心,通过输出125 kHz的方波源为后面的功放电路提供驱动信号,功放电路为天线负载提供放大后的125 kHz方波,从而使天线负载能为标签提供足够的能量,同时获取标签信息。检波电路实现对标签信息的检波功能,检波后通过方波信号转换电路转换传送给STM32进行解码,同时将标签信息通过STM32串口传送到上位机进行后续处理。整个系统框图如图1所示。     本系统与现有系统的区别在于: 1)不需要专用的解码芯片进行解码直接利用STM32具有的捕获功能对检波转换后的电子标签信号进行解码。 2)利用了STM32能输出一对带死区互补方波的功能对一对开关管进行驱动,省去了复杂的模拟电子电路生成同样的驱动波形。 3)借鉴开关电源中半桥逆变电路的原理,使IC电路形成串联谐振,从而实现了功事放大。 2 硬件电路设计 2.1功率放大电路设计 功率放大电路采用两个开关管和一个LC振荡电路(天线)形成,经过分析功率放大电路设计如图2所示。     其中S1、S2是由STM32输出经驱动芯片IR2110后的两路带死区控制的PWM波,频率为125 kHz。这样就使天线L1与电容C1构成串联谐振电路,谐振频率为125 kHz,谐振电路的作用是使天线获得最大的电流,从而产生磁通量,获得更大的读卡距离。 天线本身是一个低电阻的器件将天线线圈连接到功放电路需要估算天线的等效电路和品质因子以得出匹配电路的电容推荐值。     一般来说,由于天线的磁场辐射,对Q值的要求大概在20到40比较合适。现在根据天线的Q值来确定天线的感量,现在的一些工业标准主要采用绕制50 Ω,Q值取30,工作频率是125 kHz则fR取125 kHz,由以上3,个数据可以得到RFID天线的感量为375 μH。 天线的绕制:首先大概的绕几圈,然后使用阻抗分析仪,在125 kHz工作频率下测量电感。本设计中,绕制10圈检测后得到感量为89.03 μH。电感的计算公式: L=N2×L1(3)(L1表示单圈电感感量,N表示线圈匝数),由上述公式可以得到天线的单圈感量为0.89μH。即由以上电感的值可以求得天线的需要的匝数,大概需要21圈。 天线的设计完成之后,需要选择相应的阻抗匹配电路。现在本设计主要选择利用CBB电容来达到阻抗匹配的目的,电容的大小由系统的工作频率来确定。阻抗匹配主要目的是使天线工作在最佳状态,即天线和电容处于谐振状态。 由上面分析电容的大小计算公式:     此公式可以确定电容的大小在4.7 μF,CBB电容的耐压值还需要根据通过电容的振荡波形的峰值来确定。 2. 2 包络检波电路的设计 包络电路的设计很大程度决定了RFID阅读器的读取距离,它主要工作原理就是低通滤波器和二极臂串联工作,把高频125 kHz波滤除。电路设计主要采用串联型二极管包络检波,其工作原理如图3所示。     电路由二极管D和RLC低通滤波器相串接构成。输入Us时,通过D的电流i在RLC电路产生平均电压UAV,该电压又反作用于D上(称平均电压负反馈效应),影响通过二极管的电流。 若Us=Vcm(1+MacosΩt)cosωct,则vov=ηdVcm+ηdMaVcmcosΩ=VAV+Vov,其中vov∝vΩ,所以实现了线性检波。 3 软件设计 终端软件要解决的关键问题是如何正确接收数据并解码。本RFID系统选用的电子标签为曼切斯特解码,电子标签信号经曼切斯特编码器后的输出信号见图4所示。     利用STM32的捕获功能对整形后的波形进行捕获计时,每延时384μs之后,STM32检测是否为高电平。然后对前后电平进行比较,若是01则表示数据0,若10表示数据1。[!--empirenews.page--] 电子标签中的64bit数据以NRZ串行送入比较器,所谓NRZ就是基带传输,也就是在线路中直接传送数字信号的电脉冲,这是一种最筒单的传输方式,近距离的通信的局域网都采用基带传输。经反向比较器后输出曼切斯特码波形,然后直接输入STM32进行曼切斯特解码。其工作原理;在一个读取数据的周期内,若引脚为高电平,读取的数据为1;若引脚为低电平,读取的数据就为0。总的来说整个系统的工作过程就是曼切斯特解码过程。 4 程序流程图 4.1 STM32总程序流程图 STM32总程序流程图,如图5所示。     4.2 STM32解码过程程序框图 通过对曼切斯特解码原理的分析,单片机主要是处理包络电路给出的方波信号,得到相应的数据。可以得到如下的系统框图如图6所示。     5 测试结果 电子标签的读取距离为10 cm左右。图7为STM32输出125 kHz带死区互补方波的实测图,图8为检波、转换后的波形。由图7的波形可得STM32的输出波形频率为125 kHz,死区时间为0.9μs,符合设计要求。     6 结束语 目前存在的一些阅读器,需要专用的读卡芯片进行解码,电路复杂,文中主要介绍了一种采用STM32解码、互补输出、死区控制的LF RFID阅读器。以STM32作为其控制核心,可以对电子标签卡进行检测、识别,并对识别的信息进行相应的处理。电路结构简单,用于读取EM4100型ID卡具有一定的实用价值。

    时间:2012-12-24 关键词: RFID STM32 设计教程

  • STM32中断向量表初探

     cortex-M3的异常向量表中的内容并不是指令,0x00000000处(当然也可能映射到别的范围)是主堆栈指针的数值,0x00000004的内容是复位后需要跳转到的地址,是一个地址而不是一条指令。 0x08000000数据如下(memory 窗口查看--STM32小端): 10 02 00 20 05 19 00 08 AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD __initial_sp //0x20000210; Top of Stack DCD Reset_Handler //0x08001905; Reset Handler---最后跳转到main函数 DCD NMI_Handler //0x08001909; NMI Handler DCD HardFault_Handler //0x0800190B; Hard Fault Handler DCD MemManage_Handler //0x0800190D; MPU Fault Handler DCD BusFault_Handler //0x0800190F; Bus Fault Handler DCD UsageFault_Handler //0x08001911; Usage Fault Handler DCD 0 //0x00000000 ; Reserved DCD 0 //0x00000000; Reserved DCD 0 //0x00000000; Reserved DCD 0 //0x00000000; Reserved DCD SVC_Handler //0x08001913; SVCall Handler DCD DebugMon_Handler //0x08001915; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler //0x08001917; PendSV Handler DCD SysTick_Handler //0x08000101; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler //0x0800191B; Window Watchdog DCD PVD_IRQHandler //0x0800191B; PVD through EXTI Line detect DCD TAMPER_IRQHandler //0x0800191B; Tamper DCD RTC_IRQHandler //0x0800191B; RTC DCD FLASH_IRQHandler //0x0800191B; Flash DCD RCC_IRQHandler //0x0800191B; RCC DCD EXTI0_IRQHandler //0x0800191B; EXTI Line 0 DCD EXTI1_IRQHandler //0x0800191B; EXTI Line 1 DCD EXTI2_IRQHandler //0x0800191B; EXTI Line 2 DCD EXTI3_IRQHandler //0x0800191B; EXTI Line 3 DCD EXTI4_IRQHandler //0x0800191B; EXTI Line 4 DCD DMAChannel1_IRQHandler //0x0800191B; DMA Channel 1 DCD DMAChannel2_IRQHandler //0x0800191B; DMA Channel 2 DCD DMAChannel3_IRQHandler //0x0800191B; DMA Channel 3 DCD DMAChannel4_IRQHandler //0x0800191B; DMA Channel 4 DCD DMAChannel5_IRQHandler //0x0800191B; DMA Channel 5 DCD DMAChannel6_IRQHandler //0x0800191B; DMA Channel 6 DCD DMAChannel7_IRQHandler //0x0800191B; DMA Channel 7 DCD ADC_IRQHandler //0x0800191B; ADC DCD USB_HP_CAN_TX_IRQHandler //0x0800191B; USB High Priority or CAN TX DCD USB_LP_CAN_RX0_IRQHandler //0x0800191B; USB Low Priority or CAN RX0 DCD CAN_RX1_IRQHandler //0x0800191B; CAN RX1 DCD CAN_SCE_IRQHandler //0x0800191B; CAN SCE DCD EXTI9_5_IRQHandler //0x0800191B; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler //0x0800191B; TIM1 Break DCD TIM1_UP_IRQHandler //0x0800191B; TIM1 Update DCD TIM1_TRG_COM_IRQHandler //0x0800191B; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler //0x0800191B; TIM1 Capture Compare DCD TIM2_IRQHandler //0x0800191B; TIM2 DCD TIM3_IRQHandler //0x0800191B; TIM3 DCD TIM4_IRQHandler //0x0800191B; TIM4 DCD I2C1_EV_IRQHandler //0x0800191B ; I2C1 Event DCD I2C1_ER_IRQHandler //0x0800191B; I2C1 Error DCD I2C2_EV_IRQHandler //0x0800191B ; I2C2 Event DCD I2C2_ER_IRQHandler //0x0800191B ; I2C2 Error DCD SPI1_IRQHandler //0x0800191B ; SPI1 DCD SPI2_IRQHandler //0x0800191B ; SPI2 DCD USART1_IRQHandler //0x0800191B ; USART1 DCD USART2_IRQHandler //0x0800191B ; USART2 DCD USART3_IRQHandler //0x0800191B ; USART3 DCD EXTI15_10_IRQHandler //0x0800191B ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler //0x0800191B ; RTC Alarm through EXTI Line 0x080000EA DCD USBWakeUp_IRQHandler //0x0800191B ; USB Wakeup from suspend   0x08003608 0x20000000 0x00000010 0x08003618 0x20000010 0x00000200

    时间:2013-03-23 关键词: STM32 设计教程

  • STM32串口多机通信

     STM32 的UART数据寄存器是9位,数据传输先传低位(LSB) --实际应用发现9位数据大时候有丢包错包问题?? 利用USART可以进行多机处理器通信,其原理就是使从机处于静默模式,由主机在需要的时候发送指令唤醒从机,并传输数据。STM32静默模式特点:1、所有接收状态位都不会被设置;2、所有的接收中断都被禁止;3、USART_CR1寄存器中的RWU位被置1,RUW可以硬件自动控制或者在某些条件下由软件写。 连接方法很简单,主机的TX输出与从机的RX端口直接相连,从机TX端口要经过与门与主机RX端口连接。 多机通信方式有2种:空闲帧唤醒和地址唤醒。 空闲帧唤醒可以同时唤醒所有从机,在从机处于静默模式时发送空闲帧(即所有位均为1的数据),唤醒多个从机,实现多个从机同步。 地址唤醒可以唤醒单个从机,从机静默时发送地址帧,从机自动对比地址,地址配对正确则该从机唤醒,否则继续进入静默。这样只有被寻址者才被激活,来接收数据,减少由未被寻址的接收机器参与带来的多余的USART服务开销。这种模式下,MSB为1的字节被认为是地址,否则被认为是数据(MSB一般为数据传送的最高位,8位传送则MSB为第八位;9位传送则MSB为第九位)。在一个地址字节中,目标接收者的地址放在低4位。这4位会被接收器拿来和设置在USART_CR2寄存器中ADD位中的自身地址比较。当接收到一个和设置地址相匹配的地址字符时,RWU被清除,后面的字节将正常接收。因为RWU位已经被清除,RXEN位会因为接收到地址符被置1。当从机再次接收到地址符,如若地址不匹配则从机再次进入静默模式。 程序实际编写时可以注意以下3部分的设置: 一、设置静默模式: 函数原形 void USART_WakeUpConfig(USART_TypeDef* USARTx, u16 USART_WakeUp) 其中USART_WakeUp:USART的唤醒方式: 1、USART_WakeUp_IdleLine 空闲总线唤醒 2、USART_WakeUp_AddressMark 地址标记唤醒 二、地址唤醒中地址设置: 函数原形 void USART_SetAddress(USART_TypeDef* USARTx, u8 USART_Address) 其中USART_Address:是设置USART 节点的地址。 例如:USART_SetAddress(USART2, 0x5); 三、是否进入静默: 函数原形 void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState Newstate) 其中NewState: USART 静默模式的新状态这个参数可以取:ENABLE或者DISABLE。 Address mark detection (WAKE=1) In this mode, bytes are recognized as addresses if their MSB is a ‘1 else they are considered as data. In an address byte, the address of the targeted receiver is put on the 4 LSB. This 4-bit word is compared by the receiver with its own address which is programmed in the ADD bits in the USART_CR2 register. The USART enters mute mode when an address character is received which does not match its programmed address. In this case, the RWU bit is set by hardware. The RXNE flag is not set for this address byte and no interrupt nor DMA request is issued as the USART would have entered mute mode. It exits from mute mode when an address character is received which matches the programmed address. Then the RWU bit is cleared and subsequent bytes are received normally. The RXNE bit is set for the address character since the RWU bit has been cleared. The RWU bit can be written to as 0 or 1 when the receiver buffer contains no data (RXNE=0 in the USART_SR register). Otherwise the write attempt is ignored. Bit 1 RWU: Receiver wakeup This bit determines if the USART is in mute mode or not. It is set and cleared by software and can be cleared by hardware when a wakeup sequence is recognized. 0: Receiver in active mode 1: Receiver in mute mode Note: 1: Before selecting Mute mode (by setting the RWU bit) the USART must first receive a data byte, otherwise it cannot function in Mute mode with wakeup by Idle line detection. 2: In Address Mark Detection wakeup configuration (WAKE bit=1) the RWU bit cannot be modified by software while the RXNE bit is set. Bit 11 WAKE: Wakeup method This bit determines the USART wakeup method, it is set or cleared by software. 0: Idle Line 1: Address Mark “logically ANDed ” 指的是逻辑上的关系。某些情况下,不需要另外加与门电路。 比如:板上有3个STM32,1主2从,中间未加电平变换芯片(直连),从机的发送脚都配置成open drain输出并带上拉,这种情况下2个从STM32芯片的TX脚可以 直接连到主STM32芯片的RX脚。 如果用了电平变换芯片比如MAX232,一般需要另外加与门电路。

    时间:2013-03-23 关键词: STM32 设计教程

  • STM32的USART发送数据时如何使用TXE和TC标志

     在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。 当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。 另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为'1'时产生中断,而TCIE允许在TC标志为'1'时产生中断。 至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。 TXE--写寄存器DR清零 RXNE--读寄存器DR清零,也可软件手动清零 TC-- 读/写寄存器DR清零,也可软件手动清零 先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下 /******* 功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位. 输入:字符串的首地址 输出:无 *******/ void USART_SendDataString( u8 *pData ) { pDataByte = pData; USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供. USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次 } 中断处理函数如下 /******** * Function Name : USART1_IRQHandler * Description : This function handles USART1 global interrupt request. * Input : None * Output : None * Return : None *********/ void USART1_IRQHandler(void) { if( USART_GetITStatus(USART1, USART_IT_TC) == SET ) { if( *pDataByte == '' )//TC需要 读SR+写DR 方可清0,当发送到最后,到''的时候用个if判断关掉 USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE else USART_SendData(USART1, *pDataByte++ ); } } 其中u8 *pDataByte;是一个外部指针变量 在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。 void USART_Config() { ........................................ USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节 USART_Cmd(USART1, ENABLE); //使能USART1 } ..................................................................... 再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。 发送函数如下: /******* 功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位. 输入:字符串的首地址 输出:无 *******/ void USART_SendDataString( u8 *pData ) { pDataByte = pData; USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。 } 中断处理函数如下: /******** * Function Name : USART1_IRQHandler * Description : This function handles USART1 global interrupt request. * Input : None * Output : None * Return : None ********/ void USART1_IRQHandler(void) { if( USART_GetITStatus(USART1, USART_IT_TXE) == SET ) { if( *pDataByte == '' )//待发送的字节发到末尾NULL了 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断 else USART_SendData(USART1, *pDataByte++ ); } } 在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)

    时间:2013-03-23 关键词: STM32 usart txe 何使用 设计教程

  • STM32软件复位(基于库文件V3.5)

     STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(1); // 关闭所有中端 NVIC_SystemReset();// 复位 } 在官方软件库的 core_cm3.h 文件里 直接提供了 系统复位的函数 static __INLINE void NVIC_SystemReset(void) { SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ while(1); /* wait until reset */ } 但是不是直接调用这个函数就OK了? 在Cortex-M3权威指南中有这么一句话 这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令, 往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要 让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把 FAULTMASK 置位。 所以最好在将FAULTMASK 置位才万无一失。 同样官方 core_cm3.h 文件里也直接提供了该函数 static __INLINE void __set_FAULTMASK(uint32_t faultMask) { register uint32_t __regFaultMask __ASM("faultmask"); __regFaultMask = (faultMask & 1); }

    时间:2013-03-23 关键词: 3.5 STM32 设计教程 于库文

  • 基于RT-Thread和STM32的数码相框设计方案

    基于RT-Thread和STM32的数码相框设计方案

    1.引言近年来,随着数码相机的普及,一种以数码照片的保存、回放和浏览为核心功能的产品,数码相框应运而生,它以其独特的设计理念和美妙的欣赏效果倍受市场青睐。数码相框采用传统普通相框的外观造型,把传统普通相框的中间照片部分换成液晶显示屏,配上电源,控制器,存储介质等部件,可以直接展示数码照片。同时,数码相框也可以在同一个相框内循环展示不同照片,解决了需要使用电脑才能查看数码相片的缺陷,给日益增多的数码照片和喜好照片的人们提供一个更好的展示照片的平台和空间。基于此,本系统设计了基于RT-Thread和STM32的数码相框。本系统采用STM32为主控芯片,利用源代码开放的嵌入式RT-Thread操作系统和人机交互界面μC/GUI共同建立的平台设计了数码相框系统。系统主要实现了JPEG格式图片在触摸液晶屏上的浏览展示、USB主机读取功能、SPIFLASH存储等功能。2.系统总体设计本系统由嵌入式处理器、外围设备、嵌入式操作系统和应用软件等部分组成。系统以嵌入式RT- Thread和嵌入式微控制器STM32为核心平台,通过μC/GUI建立人机交互界面,利用USB主机读取功能将图片和字库文件写入外部SPI FLASH,利用文件系统读取图片文件,经过图片解码算法处理,显示在触摸液晶屏上,通过触摸完成对图片的浏览功能。系统总体结构框图如图1所示。3.系统硬件设计本系统以STM32为主要硬件平台,系统整体硬件结构图如图2所示。系统硬件主要有电源模块、STM32最小系统、JTAG下载调试接口、USB驱动电路、SPI FLASH驱动模块、触摸LCD驱动电路等部分组成。3.1电源模块本系统中微控制器及其外围电路驱动模块需要3.3V电源,系统选用的电源电池为3.7V,需要通过稳压芯片提供3.3V电压。对于产生3.3V电压,采用国家半导体公司的LM1117稳压芯片输出3.3V,LM1117提供电流限制和热保护。电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在±1%以内。输出端需要一个至少10uF的钽电容来改善瞬态响应和稳定性。LM1117稳压芯片输出3.3V电路如图3所示。3.2 USB驱动电路STM32芯片内部集成了USB外设,减轻了USB电路的设计负担,本系统设计了USB接口电路以及ESD保护电路。3.2.1 USB接口电路在USB接口电路中将USB上拉电压接到D+上,实现USB全速通讯,三极管为开关作用,当开关开启时,PC开始枚举USB存储设备。USB的VCC引脚没有接板上电源,通过PC机给USB设备供电。3.2.2 ESD保护电路采用意法半导体公司的USBLC6-2P6,该芯片使USB的D+/D-信号完全平衡,I/O接口到地线的匹配公差仅为0.04pF,完全在USB 2.0最大1pF的公差范围内。如果USB数据线路上发生ESD现象,芯片的ESD保护功能就会将电流引至地线,为了确保ESD保护的最高效能,数据线路采用轨对轨保护拓扑,为了提高输出功率,VCC线路采用钳位保护结构。USB驱动保护电路原理图如图4所示。3.3 SPI FLASH驱动电路系统采用SPI串行闪存芯片W25Q64,该芯片具有电路设计简单、数据读取速度快等优点,能够减少系统电路切换噪声,降低系统功耗及开发成本。其应用电路如图5所示。3.4 LCD触摸驱动电路本系统的触摸控制器选用TSC2046,TSC2046是四线电阻式触摸屏控制器,其核心是一个具有采样和保持功能的12位逐次逼近式A/D转换器。本系统通过STM32的SPI接口驱动TSC2046控制器,典型的驱动电路如图6所示。4.系统软件设计本系统的软件主要由系统各模块初始化、μC/GUI建立人机交互界面、文件系统读取图片及字库文件、图片解码算法的实现、触摸浏览功能及幻灯片播放功能等功能模块组成。4.1μC/GUI建立人机交互界面本系统利用μC/GUI builder建立μC/GUI人机交互界面,在μC/GUI builder中建立窗体、文本框、控件等、将编译后产生的C文件添加到工程目录中。μC/GUI builder的应用,缩短了界面开发周期,修改灵活方便,后期修改界面时,只需要在μC/GUI builder修改相关组件,编译运行即可实现程序的修改。4.2μC/GUI显示汉字μC/GUI中通过查找字模的方式来实现字体的显示。字体库中的每一个字母都有其对应的字模,字模由结构体GUI_FONT和GUI_FONT_PROP统一管理。但是μC/GUI中本身只支持英文,没有提供中文的字库源码文件。本系统在修改μC /GUI字库显示驱动函数的基础上实现了汉字的显示,以显示12*12点阵汉字为例,具体的修改步骤如下:第一步:在GUI.H中声明全局结构体对象GUI_Font12_HZ;第二步:定义存放字模数据的数组;第三步:定义用于说明每个字母的字模数据在程序段存储方式的结构体;第四步:根据汉字内码高位定义多个结构体,用于存放字库字模编码和字模数据存放地址的映像;第五步:将创建的汉字库文件HZK12.C添加至μC/GUI工程,在主函数中调用显示函数。通过以上步骤实现了中文汉字在μC/GUI界面的显示,经测试,汉字显示流畅稳定。4.3图片解码算法JPEG图片解码显示包括解析JPEG头文件信息、基于连续DCT编码的JPEG解码算法处理、转换图像格式、液晶显示等部分,总体流程图如图7所示。4.3.1解析JPEG头文件信息对JPEG解码的过程进行初始化,获取JPEG头文件中的相关信息,本系统的方法是设计一系列的结构体对应头文件中的各个信息标记,并存储标记内表示的信息,如色彩信息、采样比、图片尺寸、量化表、Huffman解码表等重要信息。4.3.2基于连续DCT编码的JPEG解码算法基于连续DCT编码的JPEG解码算法包括熵解码、反量化和反向离散余弦变换(IDCT)共三个步骤。JPEG基本系统的解码器结构图如图8所示。(1)熵解码。熵解码的输入信号是被压缩编码的比特流,输出是被解码得到的DCT变换系数的量化值。通过查找Huffman解码表将压缩图像数据还原成交流AC系数和直流DC系数组成的量化数据块。熵解码对读入的图像数据进行DC直流系数和AC交流系数的Huffman解码。JPEG算法提供标准的Huffman码表,针对每幅图像都有各自不同的特点,系统熵解码采用自适应的Huffman码表。采用自适应的Huffman码表,首先统计输入图像数据的特性,生成码树,再反推得到各级Huffman码表。在JPEG头文件信息的标记中,定义了一张表用来记录Huffman树其代码长度限制在16bit以内。JPEG头文件信息一般包含4个Huffman码:用于解码直流DC系数的Huffman码表,其中包括一个亮度表和一个色度表;用于解码交流AC系数的Huffman码表,其中包括一个亮度表和一个色度表。根据Huffman码表在文件中的保存形式,设计Huffman解码一个码字的程序,程序流程图如图9所示。解码时,输入图像压缩后的数据流,从数据流中读取比特数据组成的码字,在Huffman树中搜索码字的位置,根据码字的位置确定解码的值,解码输出结果是一个8位值。在Huffman解码过程中,如果产生了一个0xFF,就用0xFF0x00代替,把0xFF0x00当做0xFF进行处理。(2)反量化。反量化的输入信号是熵解码后的数据,通过查量化表进行计算,将在压缩过程中经过DCT变换后的频率系数还原出来,反量化成DCT系数。JPEG文件中包括亮度量化表和色度量化表两张量化表,将Huffman解码得到的系数矩阵与相应的量化矩阵相乘,即得到反量化结果。由于数据是按8×8矩阵的“Z”字形编排,所以要对反量化运算的结果进行反Zig-Zag变换。(3)反向离散余弦变换(IDCT)。反向离散余弦变换把频率域DCT分量系数反转成颜色空间域表示的图像数据。对反量化后得到的DCT变换系数经过反向离散余弦变换IDCT得到图像的像素。反离散余弦转换的输入是频率域的一个8×8分量系数块,输出则得到空间域的一个8×8像素块。在程序运行过程中,IDCT运算量较大,有大量浮点乘法和加法运算,程序执行速度较慢,这对图片能否流畅的显示有很大影响。基于此本统软件对IDCT算法了优化,采用一种快速IDCT算法[5],把二维IDCT分解成行和列两个一维IDCT,再将IDCT算法通过数学变换转化为离散傅里叶逆变换(IDFT),利用矩阵变换简化计算。在开始进行二维IDCT转换时,先对输入的反量化后的数据进行8次一维的行变换,并将存储运行结果,再对运行的结果进行8次一维的列变换,经过两次变换,得到的就是二维IDCT运算变换的结果。程序流程图如图10所示。4.3.3色彩模式转换由于液晶支持的是RGB格式的图像数据,需要把执行完解码过程得到的YCrCb格式的数据转换成RGB模式,将256级的YCrCb色彩模型转换成RGB色彩模型的计算公式如式(1)。因为R、G、B的取值范围为[0,255],需要对运算结果进行阈值保护,对超过255的数值,限定在255,小于0的数值,限定在0.经过运算最终可以得到RGB模式的图像数据,完成解码过程。4.4图片浏览模式本系统的图片浏览模式有触摸手动浏览和定时自动浏览两种模式可供选择。在触摸手动浏览模式下,有“下一张”,“上一张”,“退出”控件。通过操作触摸屏上下翻页的控件,实现浏览图片的功能。在浏览完最后一张时,系统会自动跳转到第一张。在定时自动浏览模式下,界面仅有退出控件,每隔3秒,自动进行下一张图片的浏览,并循环显示。5.系统调试5.1硬件调试通过硬件电路设计,检查元器件之间的电气连接,下载基本调试程序,检测系统板运行状况,在对USB枚举测试时,通过USB数据线连接至电脑,可以对flash存储设备进行读写操作。5.2软件调试5.2.1 LIB库的编译本系统的软件开发环境是MDK,在程序基本模块的底层驱动编写完善以后,将STM32的底层外设驱动库和μC/GUI库函数编译封装成LIB库,在后期程序开发时,大大提高了程序的编译效率,缩短了软件开发周期。5.2.2 Finsh Shell调试组件本系统采用RT-Thread嵌入式操作系统,通过其自带的用户命令行组件Finsh Shell查看系统运行状况。通过超级终端输入相应的命令来使用Finsh Shell.Finsh Shell在RT-Thread中被设计成一个独立的线程,通过串口设备输入相应的命令,系统对用户命令进行解析执行,可用来获取系统运行时信息,对任意寄存器和内存地址进行读写操作,还能够直接在shell中调用系统函数,访问系统变量。FinshShell组件的使用,在很大程度上提高了调试程序的效率。5.2.3图片解码调试由于图片解码算法占用内存较大,考虑到图片解码算法在STM32中可能会因为内存分配不足而无法正常运行,在验证图片解码函数的正确性时,先在PC机的VC模拟器上运行,用以给图片解码算法提供一个理想的运行平台。在模拟器中,用数组存储图片二进制源码,用解码算法对图片的数组数据进行解码,验证解码算法的正确性。在模拟器运行正确后,再将图片解码算法移植到本系统上运行,实践证明,STM32的内存足以支持图片解码算法正常执行。实验在VC模拟器中运行的效果图如图11所示。6.结论本文介绍了基于RT-Thread和STM32的数码相框的设计方案,通过设计相关硬件电路和软件算法,实现了数码相框对JPEG格式图片文件的浏览功能。本系统设计的基于连续IDCT变换的JPEG解码算法能够正确稳定完成JPEG格式图像的解码,解码速度较快,恢复图像的质量良好。实际测试表明,本方案具有很强的实用性。

    时间:2018-09-27 关键词: 数码相框 STM32 rt-thread 人机交互界面 设计教程 usblc6-2p6

  • 基于STM32的电池管理系统触摸屏设计方案

    基于STM32的电池管理系统触摸屏设计方案

    引 言电动车一直以清洁环保而备受关注,加上能源危机加剧、油价不断上涨,电动车也越来越受到用户的青睐。电动车一般采用锂电池供电,由多个单体电池 串联成电池组作为动力电源。但由于各个串联单体电池特性不能保证完全一致,因此相同的电流下充电放电速度也会不同,如果不进行均衡干预,电池寿命会大大缩 短,因此需要实时监控各个单体电池的状态、总电压、总电流,根据状态适时进行电池充放电均衡,并且充放电均衡时,均衡状态也要实时进行检测,所以就有了电动车电池能量管理系统(EMS)。实践证明EMS可以有效延长电动车电池使用寿命,是电动车中十分重要的管理系统。EMS主要包括:信息采集模块、充放电均衡模块、信息集中处理模块以及显示模块。图1为自主研发的电动车电池能量管理系统(EMS)的结构图, 其中信息采集模块主要完成实时采集电池组以及单体电池的电压、温度、电流等状态,对电池进行实时监控的同时也为均衡模块的开启与关闭提供依据。均衡模块主 要完成对电池特性差异进行补偿,根据采集模块采集来的信息判断电池状态,对单节电池进行充放电均衡,来实现状态特性一致。信息集中处理模块负责将采集得到 的数据进行处理、分析、计算(如SOC等),并监控均衡模块的工作,对其进行控制,同时与显示模块通信,在整个系统中起着承上启下的作用。显示模块作为唯 一的人机交互接口,不仅承担着将所有数据、以及设备状态实时地显示给用户,让用户能够直观地看到电池状态和EMS工作效果,而且还为用户与EMS的控制交 流提供接口,可以让用户设置参数,更改EMS工作状态,达到实时监管和控制的目的。如果没有显示模块人们就无法看到电池和EMS的信息,EMS的报警或提 示信息无法通知到客户,一些报警状态得不到及时处理轻则造成电池损坏,重则会导致电动车工作失控,酿成严重事故。同样客户也无法根据情况来调整和控制 EMS,也不能完全发挥EMS的作用。可见显示模块的人机交互功能是EMS中不可或缺的组成部分,从显示模块所需的功能看触摸屏是不错的选择。但如果购买 市面上的触摸屏,不仅显示内容会受触摸屏本身显示功能固定的限制而降低显示设计的灵活度、影响显示质量,并且市面上触摸屏的价格也普遍较高,给产品增加了很大一部分成本,这无疑会大大降低产品的市场竞争力。基于这种情况本文提出一种以STM32F103单片机为控制核心的比较通用的液晶触摸屏的设计方案。图1 EMS结构框图1 触摸屏的种类及工作原理触摸屏种类众多,可以分为电阻式、电容式、 红外线式、声表面波式、矢量压力传感器等,其中电阻触摸屏使用最为普遍。触摸屏系统一般包括触摸屏控制器和触摸检测装置两个部分。其中,触摸屏控制器的主 要作用是从触摸点检测装置上接收触摸信息,并将它转换成触点坐标,再送给微控制器,它同时能接收微控制器发来的命令并加以执行,触摸检测装置一般安装在显 示器的前端,主要作用是检测用户的触摸位置,并传送给触摸屏控制器。触摸屏的基本原理是,用手指或其他物体触摸安装在显示器前端的触摸屏时,所触摸的位置 (以坐标形式)由触摸屏控制器检测,并通过接口送到微控制器,从而确定输入的信息。其中触点坐标的求取方法是:如图2所示,给触摸屏的X+加正电压 V,X-接地时,在X+,X-方向上会形成均匀的电压梯度,当屏幕有触摸时,可以通过读取Y+的电压,经过A/D转换后计算求得触摸点X坐标。同理,在 Y+,Y-方向上加电压,可以通过X+上的值计算出触摸点Y坐标。计算坐标的公式如下:式中,W 为触摸屏的宽度;H 为触摸屏的高度。本方案采用的是四线电阻式触摸屏并且不使用专用的触摸屏控制器,直接由STM32F103控制以降低成本,如图2所示。图2 四线电阻触摸屏示意图2 方案用到的主要器件介绍2.1 STM32F103介绍方案中主控器件STM32F103单片机使用的是ARM 公司为要求性能高、成本低、功耗低的嵌入式应用专门设计的32位的ARM Cortex-M3内核。拥有可达128KB的嵌入式闪存、20kB的SRAM 和十分丰富的外设:两个1μs的12位ADC,一个全速USB(OTG)接口,一个CAN 接口,三个4 M/S的UART,两个18 M/S的SPI,两个I2 C等。内部还集成了复位电路、低电压检测、调压器、精确的RC振荡器等,大大方便了用户的开发。该系列单片机不仅功能强大而且功耗相当低,在72 MHz时消耗36 mA(所有外设处于工作状态),相当于0.5 mA/MHz,待机时下降到2μA ,是32位市场上功耗最低的产品。综上STM32F103系列单片机的性能完全可以满足液晶触摸显示屏的所有控制需要,内置A/D可以用于触摸屏控制,丰 富的I/O 接口可以用于与TFT液晶屏模块的通信,并且其本身自带CAN控制器可以作为与外界通信接口,用STM32F103做主控制器可以减少使用器件从而简化使 整体电路,很好地达到降低EMS成本的目标。2.2 TFT液晶屏模块本方案选用的是3.5寸的TFT液晶屏模块,工作电压3.3 V,最大工作电流70 mA.支持320×240分辨率,内置230K内存显示可到256K色,可显示文字和图形,采用LED背光设计,使用软件即可对背光亮度进行调节,内置简 体中文字库,支持2D的BTE引擎,同时建几何图形加速引擎,可以对显示对象进行复杂的操作如画面旋转功能、卷动功能、图形Pattern、双层混合显示 和文字放大等等。这些功能将可节省用户在TFT屏应用的开发时间,提升MCU软件的执行效率并且使画面更加绚丽,显示功能更加丰富,使显示屏显示能力大大 增强。提供8位或16位总线接口,方便与MCU的连线,适应性强,连接设计灵活。3 硬件连接设计方案3.1 总体构架液晶触摸显示屏系统主要由微控制器STM32F103、TFT液晶屏模块、四线电阻触摸屏以及与外界通信的CAN总线接口组成。硬件模 块连接如图3所示,其中四线电阻触摸屏的触摸检测装置安装在TFT液晶屏前面用于检测用户触摸的位置,本方案利用STM32F103 自带A/D 转换功能,由STM32F103实现触摸屏控制器的功能来直接控制四线电阻触摸屏,检测触摸信息并计算出触点坐标。然后STM32F103通过I/O接口 与TFT液晶屏模块通信,将处理好的有效信息通过TFT 液晶屏显示出来。由于STM32F103内置CAN 总线控制器所以CAN总线接口可以直接从STM32F103的管脚引出,用来与EMS进行通信,完成现实信息采集,设置参数等功能。图3 方案总体框图3.2 STM32F103与四线电阻触摸屏的接口电路如图4所示,STM32F103与四线电阻触摸屏直接通过自身的I/O口连接,实现触摸屏控制器功能。其中PA8、PA9、PA10、 PA11分别作为四个三极管的控制端,通过控制三极管通断,来控制四线触摸屏的Y+、Y-、X+、X-.PA1,PA2是两个A/D转换通道,分别连接 Y+和X+用于计算触摸点的X和Y坐标。PA3连接内部中断用于检测触摸屏是否有触摸动作。触摸屏平时运行时,令PA8、PA9、PA11输出 0,PA10=1,即只让VT2导通。当有触摸动作时,D1导通给PA3一个中断信号,STM32F103接收到中断请求后立即置PA8=1,导通 VT1,这样在Y+、Y-方向上就加上电压,同时启动A/D转换通道PA2,通过输入X+上电压计算出触摸点的Y坐标,然后同理令PA8、PA10为 0,PA9、PA11为1,启动A/D转换通道PA1,通过输入Y+上电压计算出触摸点X的坐标。图4 STM32F103与四线电阻触摸屏接口电路3.3 STM32F103与TFT液晶屏模块控制器的接口电路如图5所示,STM32F103通过I/O 接口与TFT液晶模块相连接,虽然很多的TFT液晶模块中内置的液晶屏控制器都支持SPI 接口通信(如ILI9325)但由于SPI传输速度较慢不利于液晶数据的快速传输,因此很多液晶模块都选择采用并口通信。其中PB0-PB15分别与D0-D15相连作为数据通信口,PA0、PA4、PA5、PA6、PA7 分别连接RESET、CS、RS、WR、RD,作为控制口,实现复位、片选、指令数据切换、读写等控制功能。图5 STM32F103与TFT液晶模块接口电路4 软件设计软件部分的编程采用C语言,一方面主要完成STM32F103对I/O 管脚的配置,用来实现对四线电阻触摸屏端子状态的控制,通过中断方式检测是否有触摸信息,配置A/D转换通道,读入电压根据公式计算出触点坐标。另一方面 主要完成通过与TFT液晶模块的通信控制,实现触摸点坐标与液晶屏坐标的对应并有效完成显示任务。软件的开发环境是MDK,MDK 将ARM 开发工具RealView DevelopmentSuite(简称为RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,支持ARM7、ARM9和最新的 Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能,与ARM 之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%.具体流程如图6所示。图6 程序流程图5 结束语本文提出了基于STM32F103单片机的EMS液晶显示触摸屏的设计方案。STM32F103的高速、低耗的优越性能完全可 以达到触摸屏的主控制芯片要求,TFT液晶显示器可以满足更复杂、多彩、灵活的显示任务,符合显示屏性能不断攀升的发展趋势。本设计充分利用了 STM32F103芯片的优势,抛弃了传统触摸屏控制器控制触摸屏的方案,利用自身A/D完成了触摸屏功能,本方案大大简化了硬件电路结构,通信更可靠, 编程也更加简洁,最终既能达到EMS显示要求,出色地显示和设置了系统所需要的数据,又能降低系统的成本,通过实际使用达到了良好的效果。鉴于当前电动车 的快速发展,本方案可以拥有不错的应用前景。............................................................与非深度解读系列:半导体公司“大学计划”的追问和真相大环境的不景气是就业环境恶化的元凶,但是也让我们不禁追问半导体公司的大学计划对于学子们的真正意义。厂商们的大学计划都在做些什么?那么多的联合实验室有得到充分利用吗?大学计划的直接体验者--老师和学生们是否真正从中受益…….【专栏作者:高扬】本土IC公司调查笔记全球经济不景气的大环境下一些本土IC公司的创新能力、管理能力、抗风险能力、盈利能力,甚至公司创立的动机都受到一些质疑。一方面官方的消息总是告诉我们中国的半导体产业得到了长足的进步;而街巷小道中又不绝流传多少本土IC公司倒闭,多少公司靠欺骗,根本没有核心竞争力….真相只有一个,也许会随《本土IC公司调查笔记》慢慢开启…【专栏作者:岳浩】电子屌丝的技术人生系列在这个系列里,每个故事都会向你展示一个普通工程师的经历,他们的青葱岁月和技术年华,和我们每个人的的生活都有交集。对自己、对公司、对产业、对现在、对未来、对技术、对市场、对产品、对管理的看法,以及他们的经历或正在经历的事情,我们可以看到自己的影子,也看清未来的样子……【专栏作者:任亚运】细说电子分销江湖的那些事对于从事电子分销行业的同仁们来说这是一个最坏的年代,也是一个最好的年代,我们即面临国际分销巨头在管理、资金、货源等方面对我们造成的冲击,又迎来本土集成电路的崛起,个性化服务盛行的机遇,通过这个系列,我想以“第一现场”的经历带大家一起了解国内集成电路分销的那些年、那些事,以及哪些感慨…..【专栏作者:张立恒】

    时间:2018-09-28 关键词: 触摸屏 STM32 电池管理系统 cortex-m3 设计教程

  • 意法半导体提升STM32微处理器性能,加固产品生态系统

    意法半导体提升STM32微处理器性能,加固产品生态系统

    中国,2020年2月28日 – 横跨多重电子应用领域的全球领先的半导体供应商意法半导体为STM32MP1系统微处理器(MPU)产品增加了新的授权合作伙伴和软件功能,并显著提升了处理性能,将时钟速度提高到800MHz,软件引脚与650MHz产品兼容。 新STM32MP1 MPUs现在搭载800MHz Arm®Cortex®-A7双核应用处理器和209MHz Cortex-M4处理器,具有优异的语音和音频处理性能,解码质量达到高清视频级别,在神经网络和机器学习应用中,能够实现更强大的AI(人工智能)功能,还为Android系统带来更好的用户体验。新产品集成运算及3D图形加速器,兼备高能效实时控制和高集成度。 Qt公司高级副总裁Petteri Holländer表示:“我们的高人气的Qt HMI工具包及其基于QML的GUI应用软件都可以部署在STM32 MCU和STM32MP1平台上,在大幅降低开发成本的同时加快客户产品交付周期。ST和Qt的可扩展工具套件可以轻松利用STM32MP1的硬件资源,尤其是3D 硬件GPU加速器,为工业 / 物联网应用带来一个流畅的人机界面渲染解决方案。” 利用STM32MP1的灵活架构,新产品增强了客户代码安全保护功能,例如,身份验证安全启动、客户可用一次性可编程熔丝,以及安全操作系统(OP-TEE:可信执行环境)。密钥生成器签名工具、STM32CubeProgrammer和硬件安全模块(STM32HSM)等整套安全工具可将客户的加密数据安全地输入微处理器。 作为一个主线开源Linux操作系统,OpenSTLinux Distribution 具有在应用处理器内核上运行软件所需的全部基本组件,帮助客户加快开发周期,现在又新增了Android开发者软件包和云计算支持。意法半导体继续积极参与Linux社区开发,坚持主线内核战略。 Bootlin首席执行官Michael Opdenacker表示:“ ST积极参与Linux内核社区活动,这给我们留下深刻的印象。Linux和STM32MP1同步发布将使此次发布会得到更高的关注度。我们认为,ST知道客户的兴趣在哪里,主线版本支持开源项目,新版本免费升级,零成本安全更新,开发社区支持,以及保护长期投资。享有相同的开源DNA,Bootlin很荣幸能成为ST授权合作伙伴,在这个平台上向全球客户提供工程和培训服务。” 除了STM32CubeMX和STM32CubeProgrammer等强大软件工具外,现在STM32CubeIDE调试器也可以在Cortex M-4内核上使用。 授权合作伙伴数量的快速增长极大地扩大了客户的研发能力范围,并加快了STM32MP1系列MPU应用开发周期。除了嵌入式软件 和软件开发工具外,合作伙伴还在培训 和 工程服务方面贡献专业知识。意法半导体与Phytec等多家模块系统厂商合作,满足客户对本地技术支持和系统灵活性的需求。 Phytec产品经理Yves Astein表示:“持续丰富扩大的STM32MP1产品系列,以及大量的图形处理功能和丰富的通信接口,为Phytec的phyCORE-STM32MP1系统模块提供了工业级外设,使得该模块成为人机接口以及各种实时交互应用的最佳选择。这款PhyCore 系统级模块及长期维护服务可降低任何嵌入式设计的复杂性,同时与ST团队的良好关系使我们能够按时交付系统模块,保证客户设计安全。” 意法半导体还与系统级封装制造商Octavo Systems合作,满足空间受限应用的设计需求。 Octavo Systems战略副总裁Greg Sheridan表示:我们很快意识到,Octavo必须开发一个基于STM32MP1的系统级封装,利用ST的Cortex-M产品悠久的成功历史来简化微处理器的开发使用。我们的OSD32MP1 SiP在一个18mm x 18mm的微型封装内集成STM32MP1、STPMIC1、DDR3、振荡器和无源器件,使微处理器像微控制器一样容易上手,让设计人员没有任何生疏感。结合ST授权合作伙伴计划的支持,OSD32MP1 SiP让客户能够在一款功能强大的微处理器上快速开发产品。” STM32MP1 MPU已通过工业标准认证,结温范围-40°C至125°C,10年成本归集期作业率为100%。800MHz Cortex-A7版STM32MP1现已投产。

    时间:2020-02-28 关键词: 微处理器 STM32 mpu

  • 意法半导体发布STM32CubeMonitor变量监视及可视化工具,可灵活支持多个操作系统

    意法半导体发布STM32CubeMonitor变量监视及可视化工具,可灵活支持多个操作系统

    中国,2020年3月4日——意法半导体新推出的STM32CubeMonitor软件工具能够实时显示STM32应用程序运行时的变量,同时让开发人员能够在所选的操作系统环境(Windows®、Linux或MacOS®)中自定义图形可视化设置。 STM32CubeMonitor拥有丰富而强大的测试诊断功能,方便开发者获取有价值的诊断方案。在软件的图形流编辑器中,用户只要用鼠标拖放项目和功能,即可创建自定义的仪表板,快速添加仪表、柱状图、点线图等小工具也无需编程。借助Node-RED开放社区,STM32CubeMonitor可为客户提供丰富的扩展功能,灵活处理各种类型的应用问题。 软件支持多制式显示器,可以在PC、平板电脑或移动设备等各种主机上显示应用程序行为。 STM32CubeMonitor还支持远程数据采集,用户可以通过网络远程监视应用程序,同时测试多个设备。 此外,变量实时监视及非介入式实时编写功能有助于调试无法中途停止运行的应用程序,例如,电机控制应用。 用户可以根据需求,在两种功能模式中选择最适合的工作方式。用户可以选择设计模式为特定应用创建编辑新的监视用户界面,而操作员模式则可以轻松部署预先构建的用户界面,实现生动的数据演示和现场测试。此外,STM32CubeMonitor用户将能够在ST社区共享自定义流。 作为替代STM-STUDIO-STM32工具的STM32CubeMonitor现已开放下载, 所有STM32系统用户都可以从官方网站免费下载软件。

    时间:2020-03-04 关键词: 操作系统 STM32 图形可视化

  • 意法半导体推出STM32系统芯片解析

    意法半导体推出STM32系统芯片解析

    相信大家对STM32并不陌生,它出现在我们生活的各个角落。通过智能基础设施及物流、智能工业和智能生活促进世界可持续发展,横跨多重电子应用领域的全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST; 纽约证券交易所代码:STM)展示了全球首款通过长距离无线技术将智能设备连接到物联网(IoT)的LoRa®系统芯片(SoC)。 STM32WLE5 系统芯片使产品开发人员能够创建远程环境传感器、仪表、跟踪器和过程控制器等设备,帮助企业有效地管理能源和资源的使用情况。 该系统芯片在一个易于使用的单片产品内整合了意法半导体的超低功耗STM32微控制器设计技术与LoRa兼容射频技术。有多项专利正在审批中的射频功率管理架构将确保STM32WLE5具有独一无二的性能。意法半导体LoRaWAN无线网络通信软件已经通过所有区域认证,可在全球范围内使用。 意法半导体微控制器事业部总经理Ricardo De Sa Earp表示:“我们的新产品STM32 无线系统芯片扩展了现有的STM32W 无线MCU产品线,简化了新产品开发,同时节省了材料清单成本,并使系统可靠性和能效最大化。此外,通过将现有嵌入式设计移植到STM32WLE5,开发人员可以轻松地引入无线连接,充分利用STM32 MCU架构的优势。” 意法半导体工业产品10年生命周期滚动保证 承诺支持STM32WLE5用户。 STM32WLE5采用5mm x 5mm UFBGA73封装,完全支持经过市场检验的STM32生态系统,包括STM32Cube软件工具,以及获得认证的全球通用的LoRaWAN软件栈和源代码。若了解OEM客户订购、产品价格和样片申请信息,请联系当地意法半导体销售办事处,。 技术详情: 片上集成的射频模块基于Semtech SX126x IP内核,具有高低功率两种发射模式,涵盖全球1GHz以下150MHz-960MHz的开放频带,确保模块兼容所有地区的LoRa网络。因此,OEM厂商可以将STM32WLE5部署到全球所有市场,确保技术层面的兼容性,并有助于提高运营效率和客户支持服务。接受灵敏度低至-148 dBm,集成两个最高15dBm的功率放大器,在同一封装内,最大发射功率可达22dBm,从而最大限度地延长了无线通信距离。 除了嵌入式LoRa调制技术之外,STM32WLE5还能够处理(G)FSK, (G)MSK和BPSK调制方法,因此,允许开发者使用各种替代协议,包括专有协议。此外,高射频性能且低功耗,确保无线连接的可靠性,并延长电池续航时间。 该微控制器利用意法半导体的STM32L4架构,该架构基于支持DSP扩展指令集的Arm®Cortex®-M4内核,提供超低功耗技术,包括动态电压调节和意法半导体的零等待周期执行闪存代码的自适应实时加速技术ART Accelerator™。 片上闪存容量充足,64KB、128KB和256KB 三种容量可选,使开发人员可以为包括应用和射频在内的整个平台,选择最佳的代码存储容量和数据存储容量。用户还受益于STM32L4微控制器的内置数据安全功能,包括硬件公钥加速器(PKA)、硬件随机数发生器(TRNG)、扇区读写保护(PCROP)以及支持包括RSA在内的最先进的加密算法。以上就是STM32的知识讲解,对大家在选择的时候有一定的参考意义。

    时间:2020-03-26 关键词: 芯片 STM32 意法半导体

  • MCU芯片的异常处理

    MCU芯片的异常处理

    相信很多血硬件的人都会用MCU,在硬件工程师的日常工作中,经常会和MCU芯片进行打交道,出现异常情况是常有的事情,那么对于初级工程师的应变能力还是欠缺,还是需要时间和经验的打磨。下面我们看看资深工程师是怎么处理异常情况的! 针对类似严重异常情况的原因我在这里大致总结下,与大家分享。 1、时钟问题。一般表现在时钟配置异常,比方配置超出芯片主频工作范围。【对于STM32系列MCU,如果使用STM32CUBEMX图形化工具做配置,基本可以回避这个问题】 2、电源问题。比方电源质量差,纹波过大,尤其开关电源供电时;或者供电芯片质量差,输出不稳定;或者系统供电能力不足而引起电源波动等。 3、BOOT脚配置问题。对于ARM芯片往往都有些BOOT配置脚。经常遇到有人因为BOOT脚的焊接或接触不良导致各类奇怪问题。这种情况多表现在芯片功能时好时坏,或者部分芯片正常,部分芯片异常。 4、启动文件问题。经常因为选错了启动文件,导致程序无法正常运行,或者说调试时好好的,脱机运行就出鬼。这点在做不同系列芯片间移植时最容易碰到。 5、中断请求位清除问题。由于中断请求位没有及时清除导致中断没完没了的重复进入,感觉系统死机一般。 6、堆或栈的越界溢出。这个也会导致芯片无法正常工作,调试时往往可能会有硬错提示。 7、VCAP脚问题。有些MCU芯片有VCAP脚,该类脚往往需要接上适当的电容,如果无视了它的话,也可能导致整个芯片的功能异常。 上面这几个原因比较容易导致MCU出现功能严重异常,也不太容易简单地通过查看MCU技术手册直接获得答案,分享出来算作一些提醒。以上就是MCU的一些异常处理方法,希望能带给大家帮助。

    时间:2020-03-28 关键词: 芯片 MCU STM32

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包

更多

推荐博客