當前位置:首頁 > stm32
  • STM32 矩陣鍵盤掃描

    #define __JUZHENJIANPAN_H extern u8 Keyscan(void); extern void GPIO_Config(void); #endif #include "stm32f10x.h" #include"juzhenjianpan.h" #include"gpiobitmap.h" #define PC0 PCo_0 #define PC1 PCo_1 #define PC2 PCo_2 #define PC3 PCo_3 #define PC4 PCo_4 void GPIO_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE); } u8 Keyscan(void) { u8 key; u16 temp; key=0; GPIOC->CRL&=0X00000000;//將PC0設置成out——pp輸出 GPIOC->CRL|=0X33333333; GPIOC->ODR|=0x00ff; GPIOC->CRL&=0x00000000; /////去除將PCx設置成out——pp輸出是的某些設置位 GPIOC->CRL|=0X44444444; /////配置為浮空輸入了 GPIOC->CRL&=0XFFFFFFF0;//將PC0設置成out——pp輸出 GPIOC->CRL|=0X00000003; PC0=0; temp=GPIOC->IDR; temp&=0x00ff; if(temp!=0x00fe) { switch(temp) { case 0x00ee: key=4;break; case 0x00de: key=3;break; case 0x00be: key=2;break; case 0x007e: key=1;break; } temp=GPIOC->IDR; temp&=0x00f0; while(temp!=0xf0) { temp=GPIOC->IDR; temp&=0x00f0; } } GPIOC->CRL&=0X00000000;//將PC0設置成out——pp輸出 GPIOC->CRL|=0X33333333; GPIOC->ODR|=0x00ff; GPIOC->CRL&=0x00000000; GPIOC->CRL|=0X44444444; GPIOC->CRL&=0XFFFFFF0F; //PC0設置成out——pp輸出 GPIOC->CRL|=0X00000030; PC1=0; temp=GPIOC->IDR; temp&=0x00ff; if(temp!=0x00fd) { switch(temp) { case 0x00ed: key=8;break; case 0x00dd: key=7;break; case 0x00bd: key=6;break; case 0x007d: key=5;break; } temp=GPIOC->IDR; temp&=0x00f0; while(temp!=0xf0) { temp=GPIOC->IDR; temp&=0x00f0; } } GPIOC->CRL&=0X00000000;//將PC0設置成out——pp輸出 GPIOC->CRL|=0X33333333; GPIOC->ODR|=0x00ff; GPIOC->CRL&=0x00000000; GPIOC->CRL|=0X44444444; GPIOC->CRL&=0XFFFFF0FF;//PC0設置成out——pp輸出 GPIOC->CRL|=0X00000300; PC2=0; temp=GPIOC->IDR; temp&=0x00ff; if(temp!=0x00fb) { switch(temp) { case 0x00eb: key=12;break; case 0x00db: key=11;break; case 0x00bb: key=10;break; case 0x007b: key=9;break; } temp=GPIOC->IDR; temp&=0x00f0; while(temp!=0xf0) { temp=GPIOC->IDR; temp&=0x00f0; } } GPIOC->CRL&=0X00000000; GPIOC->CRL|=0X33333333; //將PC0設置成out——pp輸出 GPIOC->ODR|=0x00ff; GPIOC->CRL&=0x00000000; GPIOC->CRL|=0X44444444; GPIOC->CRL|=0X00003000; PC3=0; temp=GPIOC->IDR; temp&=0x00ff; if(temp!=0x00f7) { switch(temp) { case 0x00e7: key=16;break; case 0x00d7: key=15;break; case 0x00b7: key=14;break; case 0x0077: key=13;break; } temp=GPIOC->IDR; temp&=0x00f0; while(temp!=0xf0) { temp=GPIOC->IDR; temp&=0x00f0; } } return key; } #ifndef __GPIOBITMAP_H #define __GPIOBITMAP_H #include "stm32f10x.h" //IO口操作宏定義 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 //IO口操作,只對單一的IO口! //確保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //輸出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //輸入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //輸出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //輸入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //輸出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //輸入 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入 /*------------------------------ ******************************* 各GPIO輸出口地址定義 ******************************** --------------------------------*/ #define PAo_0 PAout(0) #define PAo_1 PAout(1) #define PAo_2 PAout(2) #define PAo_3 PAout(3) #define PAo_4 PAout(4) #define PAo_5 PAout(5) #define PAo_6 PAout(6) #define PAo_7 PAout(7) #define PAo_8 PAout(8) #define PAo_9 PAout(9) #define PAo_10 PAout(10) #define PAo_11 PAout(11) #define PAo_12 PAout(12) #define PAo_13 PAout(13) #define PAo_14 PAout(14) #define PAo_15 PAout(15) //----------------------------------// #define PBo_0 PBout(0) #define PBo_1 PBout(1) #define PBo_2 PBout(2) #define PBo_3 PBout(3) #define PBo_4 PBout(4) #define PBo_5 PBout(5) #define PBo_6 PBout(6) #define PBo_7 PBout(7) #define PBo_8 PBout(8) #define PBo_9 PBout(9) #define PBo_10 PBout(10) #define PBo_11 PBout(11) #define PBo_12 PBout(12) #define PBo_13 PBout(13) #define PBo_14 PBout(14) #define PBo_15 PBout(15) //--------------------------------// #define PCo_0 PCout(0) #define PCo_1 PCout(1) #define PCo_2 PCout(2) #define PCo_3 PCout(3) #define PCo_4 PCout(4) #define PCo_5 PCout(5) #define PCo_6 PCout(6) #define PCo_7 PCout(7) #define PCo_8 PCout(8) #define PCo_9 PCout(9) #define PCo_10 PCout(10) #define PCo_11 PCout(11) #define PCo_12 PCout(12) #define PCo_13 PCout(13) #define PCo_14 PCout(14) #define PCo_15 PCout(15) //---------------------------// #define PDo_0 PDout(0) #define PDo_1 PDout(1) #define PDo_2 PDout(2) #define PDo_3 PDout(3) #define PDo_4 PDout(4) #define PDo_5 PDout(5) #define PDo_6 PDout(6) #define PDo_7 PDout(7) #define PDo_8 PDout(8) #define PDo_9 PDout(9) #define PDo_10 PDout(10) #define PDo_11 PDout(11) #define PDo_12 PDout(12) #define PDo_13 PDout(13) #define PDo_14 PDout(14) #define PDo_15 PDout(15) //------------------------------// #define PEo_0 PEout(0) #define PEo_1 PEout(1) #define PEo_2 PEout(2) #define PEo_3 PEout(3) #define PEo_4 PEout(4) #define PEo_5 PEout(5) #define PEo_6 PEout(6) #define PEo_7 PEout(7) #define PEo_8 PEout(8) #define PEo_9 PEout(9) #define PEo_10 PEout(10) #define PEo_11 PEout(11) #define PEo_12 PEout(12) #define PEo_13 PEout(13) #define PEo_14 PEout(14) #define PEo_15 PEout(15) //---------------------------// #define PFo_0 PFout(0) #define PFo_1 PFout(1) #define PFo_2 PFout(2) #define PFo_3 PFout(3) #define PFo_4 PFout(4) #define PFo_5 PFout(5) #define PFo_6 PFout(6) #define PFo_7 PFout(7) #define PFo_8 PFout(8) #define PFo_9 PFout(9) #define PFo_10 PFout(10) #define PFo_11 PFout(11) #define PFo_12 PFout(12) #define PFo_13 PFout(13) #define PFo_14 PFout(14) #define PFo_15 PFout(15) //---------------------------// #define PGo_0 PGout(0) #define PGo_1 PGout(1) #define PGo_2 PGout(2) #define PGo_3 PGout(3) #define PGo_4 PGout(4) #define PGo_5 PGout(5) #define PGo_6 PGout(6) #define PGo_7 PGout(7) #define PGo_8 PGout(8) #define PGo_9 PGout(9) #define PGo_10 PGout(10) #define PGo_11 PGout(11) #define PGo_12 PGout(12) #define PGo_13 PGout(13) #define PGo_14 PGout(14) #define PGo_15 PGout(15) /*------------------------------ ******************************** 各GPIO輸入口地址定義 ******************************** --------------------------------*/ #define PAi_0 PAin(0) #define PAi_1 PAin(1) #define PAi_2 PAin(2) #define PAi_3 PAin(3) #define PAi_4 PAin(4) #define PAi_5 PAin(5) #define PAi_6 PAin(6) #define PAi_7 PAin(7) #define PAi_8 PAin(8) #define PAi_9 PAin(9) #define PAi_10 PAin(10) #define PAi_11 PAin(11) #define PAi_12 PAin(12) #define PAi_13 PAin(13) #define PAi_14 PAin(14) #define PAi_15 PAin(15) //---------------------------------// #define PBi_0 PBin(0) #define PBi_1 PBin(1) #define PBi_2 PBin(2) #define PBi_3 PBin(3) #define PBi_4 PBin(4) #define PBi_5 PBin(5) #define PBi_6 PBin(6) #define PBi_7 PBin(7) #define PBi_8 PBin(8) #define PBi_9 PBin(9) #define PBi_10 PBin(10) #define PBi_11 PBin(11) #define PBi_12 PBin(12) #define PBi_13 PBin(13) #define PBi_14 PBin(14) #define PBi_15 PBin(15) //---------------------------------// #define PCi_0 PCin(0) #define PCi_1 PCin(1) #define PCi_2 PCin(2) #define PCi_3 PCin(3) #define PCi_4 PCin(4) #define PCi_5 PCin(5) #define PCi_6 PCin(6) #define PCi_7 PCin(7) #define PCi_8 PCin(8) #define PCi_9 PCin(9) #define PCi_10 PCin(10) #define PCi_11 PCin(11) #define PCi_12 PCin(12) #define PCi_13 PCin(13) #define PCi_14 PCin(14) #define PCi_15 PCin(15) //-------------------------------------// #define PDi_0 PDin(0) #define PDi_1 PDin(1) #define PDi_2 PDin(2) #define PDi_3 PDin(3) #define PDi_4 PDin(4) #define PDi_5 PDin(5) #define PDi_6 PDin(6) #define PDi_7 PDin(7) #define PDi_8 PDin(8) #define PDi_9 PDin(9) #define PDi_10 PDin(10) #define PDi_11 PDin(11) #define PDi_12 PDin(12) #define PDi_13 PDin(13) #define PDi_14 PDin(14) #define PDi_15 PDin(15) //-------------------------------------// #define PEi_0 PEin(0) #define PEi_1 PEin(1) #define PEi_2 PEin(2) #define PEi_3 PEin(3) #define PEi_4 PEin(4) #define PEi_5 PEin(5) #define PEi_6 PEin(6) #define PEi_7 PEin(7) #define PEi_8 PEin(8) #define PEi_9 PEin(9) #define PEi_10 PEin(10) #define PEi_11 PEin(11) #define PEi_12 PEin(12) #define PEi_13 PEin(13) #define PEi_14 PEin(14) #define PEi_15 PEin(15) //---------------------------------// #define PFi_0 PFin(0) #define PFi_1 PFin(1) #define PFi_2 PFin(2) #define PFi_3 PFin(3) #define PFi_4 PFin(4) #define PFi_5 PFin(5) #define PFi_6 PFin(6) #define PFi_7 PFin(7) #define PFi_8 PFin(8) #define PFi_9 PFin(9) #define PFi_10 PFin(10) #define PFi_11 PFin(11) #define PFi_12 PFin(12) #define PFi_13 PFin(13) #define PFi_14 PFin(14) #define PFi_15 PFin(15) //---------------------------------// #define PGi_0 PGin(0) #define PGi_1 PGin(1) #define PGi_2 PGin(2) #define PGi_3 PGin(3) #define PGi_4 PGin(4) #define PGi_5 PGin(5) #define PGi_6 PGin(6) #define PGi_7 PGin(7) #define PGi_8 PGin(8) #define PGi_9 PGin(9) #define PGi_10 PGin(10) #define PGi_11 PGin(11) #define PGi_12 PGin(12) #define PGi_13 PGin(13) #define PGi_14 PGin(14) #define PGi_15 PGin(15) //---------------------------------// /////////////////////////////////////////////////////////////////// //Ex_NVIC_Config專用定義 #define GPIO_A 0 #define GPIO_B 1 #define GPIO_C 2 #define GPIO_D 3 #define GPIO_E 4 #define GPIO_F 5 #define GPIO_G 6 #define FTIR 1 //下降沿觸發 #define RTIR 2 //上升沿觸發 #endif

    時間:2012-09-08 關鍵詞: STM32 設計教程

  • STM32 延時函數封裝

    /*--------------------------------- 延時模塊函數 說明:只需在工程中加入delay.c和delay.h 文件,即可用 Delayms(__IO uint32_t nTime); Delayus(__IO uint32_t nTime) -----------------------------------*/ #ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" /*--------------------------------- 描 述:參數1即為1ms,1000即為1s;只有幾 us的誤差; -----------------------------------*/ extern void Delayms(__IO uint32_t nTime); /*--------------------------------- 描 述:參數1即為1us,1000即為1ms;只有幾 us的誤差; -----------------------------------*/ extern void Delayus(__IO uint32_t nTime); /*--------------------------------- 函數名:延時調整形式的delaynus函數, 描 述:參數1即為1us,1000即為1ms; -----------------------------------*/ extern void delay_nus(unsigned long n); /*--------------------------------- 函數名:延時調整形式的delaynms函數, 描 述:參數1即為1ms,1000即為1s; -----------------------------------*/ extern void delay_nms(unsigned long n); #endif C 函數 /*--------------------------------- 延時模塊函數 說明:只需在工程中加入delay.c和delay.h 文件,即可用 Delayms(__IO uint32_t nTime); Delayus(__IO uint32_t nTime) -----------------------------------*/ #include"delay.h" static __IO uint32_t TimingDelay; /* Private function prototypes -----------------------------------------------*/ /*--------------------------------- 函數名:ms延時函數 描 述:參數1即為1ms,1000即為1s;只有幾 us的誤差; -----------------------------------*/ void Delayms(__IO uint32_t nTime) { while(SysTick_Config(SystemCoreClock/1000)); TimingDelay = nTime; while(TimingDelay != 0); SysTick->CTRL=0x00; //關閉計數器 SysTick->VAL =0X00; //清空計數器 } /*--------------------------------- 函數名:us延時函數 描 述:參數1即為1us,1000即為1ms;只有幾 us的誤差; -----------------------------------*/ void Delayus(__IO uint32_t nTime) { while(SysTick_Config(SystemCoreClock/1000000)); TimingDelay = nTime; while(TimingDelay != 0); SysTick->CTRL=0x00; //關閉計數器 SysTick->VAL =0X00; //清空計數器 } /*--------------------------------- 函數名:延時輔助函數 描 述: -----------------------------------*/ void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } /*--------------------------------- 函數名:systick的中斷函數 描 述:參數1即為1us,1000即為1ms;只有幾 us的誤差; -----------------------------------*/ void SysTick_Handler(void) { TimingDelay_Decrement(); } /*--------------------------------- 函數名:延時調整形式的delaynus函數, 描 述:參數1即為1us,1000即為1ms; -----------------------------------*/ void delay_nus(unsigned long n) { unsigned long j; while(n--) { j=12; while(j--); } } /*--------------------------------- 函數名:延時調整形式的delaynms函數, 描 述:參數1即為1ms,1000即為1s; -----------------------------------*/ void delay_nms(unsigned long n) { while(n--) delay_nus(1030); }

    時間:2012-09-08 關鍵詞: 封裝 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 圖形可視化

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

技術子站

更多

項目外包

更多

推薦博客

新时时彩
经典老版美女单机麻将 东京热封面合集bt 上马麻里子百度云 罗曼诺夫财富 波多野结衣13全集无码 山东十一选五遗漏数 股票配资来大圣配资 东京热哪个最漂亮 老11选5开奖结果 足球即时赔率即时比分即时指数 陕西11选五5开奖 什么叫上证指数和深证成指 吉泽明步300部作品封面 新十一选五玩法规则 上证指数吧股吧 竞彩比分投注秘诀