µØÇò´å

? Ëæ×Ź㲥¡¢µçÊÓºÍÆäËüµç×Óý½éµÄ³öÏÖ£¬ÈËÓëÈËÖ®¼äµÄʱ¿Õ¾àÀëÖèÈ»Ëõ¶Ì£¬Õû¸öÊÀ½ç½ôËõ³ÉÒ»¸ö¡°´åÂ䡱¡£ÓÖÒëΪÊÀ½ç´å£¬¼ÓÄô󴫲¥Ñ§¼ÒM.Âó¿Ë¬ºº1967ÄêÔÚËûµÄ¡¶Ã½½é¼´ÐÅÏ¢¡·Ò»ÊéÖÐÊ×´ÎÌá³ö¡£

??µØÇò´åµÄ³öÏÖ´òÆÆÁË´«Í³µÄʱ¿Õ¹ÛÄʹÈËÃÇÓëÍâ½çÄËÖÁÕû¸öÊÀ½çµÄÁªÏµ¸üΪ½ôÃÜ £¬ÈËÀà±äµÃÏ໥¼ä¸ü¼ÓÁ˽âÁË¡£µØÇò´åÏÖÏóµÄ²úÉú¸Ä±äÈËÃǵÄÐÂÎŹÛÄîºÍÐû´«¹ÛÄÆÈʹÐÂÎÅ´«²¥Ã½½é¸ü¶àµØ¹Ø×¢ÊÜ´«ÕßµÄÐËȤºÍÐèÒª£¬¸ü¼Ó×¢ÖØÊ±Ð§ÐÔºÍÄÚÈÝÉϵĿ͹ÛÐÔ¡¢ÕæÊµÐÔ¡£µØÇò´å´Ù½øÁËÊÀ½ç¾­¼ÃÒ»Ì廯½ø³Ì¡£
??µØÇò´åÊÇ»¥ÁªÍøµÄ·¢Õ¹£»ÊÇÐÅÏ¢ÍøÂçʱ´úµÄ¼¯ÖÐÌåÏÖ£»ÊÇ֪ʶ¾­¼Ãʱ´úµÄÒ»ÖÖÐγɡ£
void Load_APP(uint32_t appxaddr) { // stm32ÖÐÓÐЧµÄ³ÌÐòÒÔ0x20000000¿ªÊ¼£¨ÄÚ²¿RAMµÄÆðʼµØÖ·£© if (((*(volatile uint32_t *)appxaddr) & 0x2FFE0000) == 0x20000000) // ¼ì²éÕ»¶¥µØÖ·ÊÇ·ñºÏ·¨. { // 1¡¢ÉèÖÃÖ÷¶ÑÕ»Ö¸Õë 2¡¢¸üÐÂÖжÏÏòÁ¿±í __disable_irq(); // ¹Ø±ÕÈ«¾ÖÖÐ¶Ï LoadApp loadapp; // ¶¨ÒåÒ»¸öº¯ÊýÀàÐ͵IJÎÊý,ÓÃÓÚÌø×ªµ½Ó¦ÓóÌÐòÇø loadapp = (LoadApp) * (volatile uint32_t *)(appxaddr + 4); // Óû§´úÂëÇøµÚ¶þ¸ö×ÖΪ³ÌÐò¿ªÊ¼µØÖ·(¸´Î»µØÖ·) __set_MSP(*(__IO uint32_t *)appxaddr); // ÉèÖÃÖ÷¶ÑÕ»Ö¸Õë SCB->VTOR = (*(volatile uint32_t *)appxaddr + 4); // ÉèÖÃÖжÏÏòÁ¿±í // __set_FAULTMASK(1); // ½ûÓÃFaultÖÐ¶Ï // __set_PRIMASK(1); // __set_BASEPRI(1); HAL_DeInit(); HAL_RCC_DeInit(); HAL_NVIC_DisableIRQ(SysTick_IRQn); // ½ûÖ¹´®¿ÚÖÐ¶Ï HAL_NVIC_ClearPendingIRQ(SysTick_IRQn); // ½ûÖ¹ÍⲿÖÐ¶Ï SysTick->CTRL = 0X00; // ½ûÖ¹SysTick SysTick->LOAD = 0; SysTick->VAL = 0; // for (uint8_t i = 0; i < 8; i++) // ÊÊÓÃÓÚÖжϱàºÅÊÇ16~255 // { // NVIC->ICER[i] = 0xFFFFFFFF; // д1Çå³ýÖжÏʹÄÜ // NVIC->ICPR[i] = 0xFFFFFFFF; // д1Çå³ýÖÐ¶Ï¹ÒÆð״̬ // } __enable_irq(); // __HAL_FLASH_PREFETCH_BUFFER_DISABLE(); // __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); // __HAL_FLASH_DATA_CACHE_DISABLE(); // __HAL_FLASH_INSTRUCTION_CACHE_RESET(); __set_CONTROL(0); // Çл»»ØMSPģʽ ½«0дµ½CONTROL¼Ä´æÆ÷£¬¼´³ÌÐòÔËÐÐÔÚÌØÈ¨·ÃÎʵȼ¶£¬Ê¹ÓÃMSPÖ÷Õ»Ö¸Õë // MSR_MSP(*(volatile uint32_t *)appxaddr); // APP´úÂëÇøµÄµÚÒ»¸ö×ÖÓÃÓÚ´æ·ÅÕ»¶¥µØÖ· loadapp(); // Ìø×ªÓ¦ÓóÌÐòÇø // NVIC_SystemReset(); } } 这是我的bootloader跳转app程序
最新发布
12-18
#include <reg52.h> //°üº¬51µ¥Æ¬»úÏà¹ØµÄÍ·Îļþ #include <intrins.h> #define uint unsigned int //ÖØ¶¨ÒåÎÞ·ûºÅÕûÊýÀàÐÍ #define uchar unsigned char //ÖØ¶¨ÒåÎÞ·ûºÅ×Ö·ûÀàÐÍ uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //¶¨ÒåÊýÂë¹ÜÏÔʾÊý¾Ý 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 uchar code RecvData[]={0x19,0x46,0x15,0x44,0x43,0x40,0x0D,0x0E,0x00,0x0F}; uchar IRCOM[7]; static unsigned int LedFlash; //¶¨ÒåÉÁ¶¯ÆµÂʼÆÊý±äÁ¿ unsigned char RunFlag=0; //¶¨ÒåÔËÐбê־λ bit EnableLight=0; //¶¨ÒåָʾµÆÊ¹ÄÜλ /*************Íê³É״ָ̬ʾµÆ¶¨Òå*************/ sbit S1=P3^2; //¶¨ÒåS1°´¼ü¶Ë¿Ú /*************Íê³Éµç»ú¿ØÖƶ˿ڶ¨Òå***********/ sbit M1A=P1^2; //¶¨Òåµç»ú1ÕýÏò¶Ë¿Ú sbit M1B=P1^3; //¶¨Òåµç»ú1·´Ïò¶Ë¿Ú sbit M2A=P1^4; //¶¨Òåµç»ú2ÕýÏò¶Ë¿Ú sbit M2B=P1^5; //¶¨Òåµç»ú2·´Ïò¶Ë¿Ú sbit IRIN=P3^3; //¶¨ÒåºìÍâ½ÓÊÕ¶Ë¿Ú /*********Íê³ÉºìÍâ½ÓÊն˿ڵ͍Òå*************/ #define ShowPort P0 //¶¨ÒåÊýÂë¹ÜÏÔʾ¶Ë¿Ú extern void ControlCar(uchar CarType); //ÉùÃ÷С³µ¿ØÖÆ×Ó³ÌÐò void delayms(unsigned char x) //0.14mSÑÓʱ³ÌÐò { unsigned char i; //¶¨ÒåÁÙʱ±äÁ¿ while(x--) //ÑÓʱʱ¼äÑ­»· { for (i = 0; i<13; i++) {} //14mSÑÓʱ } } void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i); } void Delay() //¶¨ÒåÑÓʱ×Ó³ÌÐò { uint DelayTime=30000; //¶¨ÒåÑÓʱʱ¼ä±äÁ¿ while(DelayTime--); //¿ªÊ¼½øÐÐÑÓʱѭ»· return; //×Ó³ÌÐò·µ»Ø } void tingzhi() { M1A=0; //½«M1µç»úA¶Ë³õʼ»¯Îª0 M1B=0; //½«M1µç»úB¶Ë³õʼ»¯Îª0 M2A=0; //½«M2µç»úA¶Ë³õʼ»¯Îª0 M2B=0; } void qianjin() { M1A=1; M1B=0; M2A=1; M2B=0; } void houtui() { M1A=0; M1B=1; M2A=0; M2B=1; } void youzhuan() { M1A=1; M1B=0; M2A=0; M2B=1; } void zuozhuan() { M1A=0; M1B=1; M2A=1; M2B=0; } void ControlCar(unsigned char ConType) //¶¨Òåµç»ú¿ØÖÆ×Ó³ÌÐò { tingzhi(); switch(ConType) //ÅжÏÓû§É趨µç»úÐÎʽ { case 1: //ǰ½ø //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎʽ1 { tingzhi(); //½øÈëǰ½øÖ®Ç° ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ³å»÷Ö÷°å µ¼ÖÂϵͳ¸´Î» Delay1ms(240); qianjin(); ShowPort=LedShowData[1]; break; } case 2: //ºóÍË //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎʽ2 { tingzhi(); //½øÈëºóÍË֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ³å»÷Ö÷°å µ¼ÖÂϵͳ¸´Î» Delay1ms(240); // LeftLed = 1 ; houtui(); ShowPort=LedShowData[2]; //M2µç»ú·´×ª break; } case 3: //×óת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎʽ3 { tingzhi(); //½øÈë×óת֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ³å»÷Ö÷°å µ¼ÖÂϵͳ¸´Î» Delay1ms(240); zuozhuan(); ShowPort=LedShowData[3]; //M2µç»úÕýת break; } case 4: //ÓÒת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎʽ4 { tingzhi(); //½øÈëÓÒת֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ³å»÷Ö÷°å µ¼ÖÂϵͳ¸´Î» Delay1ms(240); youzhuan(); //M1µç»úÕýת ShowPort=LedShowData[4]; //M2µç»ú·´×ª break; } case 5: //Í£Ö¹ //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎʽ8 { tingzhi(); ShowPort=LedShowData[0]; break; //Í˳öµ±Ç°Ñ¡Ôñ } } } void IR_IN() interrupt 2 using 0 //¶¨ÒåINT2ÍⲿÖжϺ¯Êý { unsigned char j,k,N=0; //¶¨ÒåÁÙʱ½ÓÊÕ±äÁ¿ EX1 = 0; //¹Ø±ÕÍⲿÖжÏ,·ÀÖ¹ÔÙÓÐÐźŵ½´ï delayms(15); //ÑÓʱʱ¼ä£¬½øÐкìÍâÏû¶¶ if (IRIN==1) //ÅжϺìÍâÐźÅÊÇ·ñÏûʧ { EX1 =1; //ÍⲿÖжϿª return; //·µ»Ø } while (!IRIN) //µÈIR±äΪ¸ßµçƽ£¬Ìø¹ý9msµÄǰµ¼µÍµçƽÐźš£ { delayms(1); //ÑÓʱµÈ´ý } for (j=0;j<4;j++) //²É¼¯ºìÍâÒ£¿ØÆ÷Êý¾Ý { for (k=0;k<8;k++) //·Ö´Î²É¼¯8λÊý¾Ý { while (IRIN) //µÈ IR ±äΪµÍµçƽ£¬Ìø¹ý4.5msµÄǰµ¼¸ßµçƽÐźš£ { delayms(1); //ÑÓʱµÈ´ý } while (!IRIN) //µÈ IR ±äΪ¸ßµçƽ { delayms(1); //ÑÓʱµÈ´ý } while (IRIN) //¼ÆËãIR¸ßµçƽʱ³¤ { delayms(1); //ÑÓʱµÈ´ý N++; //¼ÆÊýÆ÷¼Ó¼Ó if (N>=30) //ÅжϼÆÊýÆ÷ÀÛ¼ÓÖµ { EX1=1; //´ò¿ªÍⲿÖжϹ¦ÄÜ return; //·µ»Ø } } IRCOM[j]=IRCOM[j] >> 1; //½øÐÐÊý¾ÝÎ»ÒÆ²Ù×÷²¢×Ô¶¯²¹Áã if (N>=8) //ÅжÏÊý¾Ý³¤¶È { IRCOM[j] = IRCOM[j] | 0x80; //Êý¾Ý×î¸ßλ²¹1 } N=0; //ÇåÁãλÊý¼ÆÂ¼Æ÷ } } if (IRCOM[2]!=~IRCOM[3]) //ÅжϵØÖ·ÂëÊÇ·ñÏàͬ { EX1=1; //´ò¿ªÍⲿÖÐ¶Ï return; //·µ»Ø } for(j=0;j<10;j++) //Ñ­»·½øÐмüÂë½âÎö { if(IRCOM[2]==RecvData[j]) //½øÐмüλ¶ÔÓ¦ { ControlCar(j); //ÊýÂë¹ÜÏÔʾÏàÓ¦ÊýÂë } } EX1 = 1; //ÍⲿÖжϿª } void main(void) //Ö÷³ÌÐòÈë¿Ú { bit ExeFlag=0; //¶¨Òå¿ÉÖ´ÐÐλ±äÁ¿ LedFlash=3000; //¶ÔÉÁµÆÊý¾Ý½øÐгõʼ»¯ EX1=1; //ͬÒ⿪ÆôÍⲿÖжÏ1 IT1=1; //É趨ÍⲿÖжÏ1ΪµÍ±ßÔµ´¥·¢ÀàÐÍ EA=1; //×ÜÖжϿªÆô ShowPort=LedShowData[0]; //ÊýÂë¹ÜÏÔʾÊý×Ö0 while(1) //³ÌÐòÖ÷Ñ­»· { Delay(); //ÑÓʱ // RunStopState=~RunStopState; //ÔËÐÐָʾµÆ×´Ì¬×ª±ä } }详细解释
06-01
#ifndef __24L01_H #define __24L01_H #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //Mini STM32¿ª·¢°å //NRF24L01 Çý¶¯º¯Êý //ÕýµãÔ­×Ó@ALIENTEK //¼¼ÊõÂÛ̳:www.openedv.com //ÐÞ¸ÄÈÕÆÚ:2010/6/16 //°æ±¾£ºV1.0 //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£ //Copyright(C) ÕýµãÔ­×Ó 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// //NRF24L01¼Ä´æÆ÷²Ù×÷ÃüÁî #define READ_REG 0x00 //¶ÁÅäÖüĴæÆ÷,µÍ5λΪ¼Ä´æÆ÷µØÖ· #define WRITE_REG 0x20 //дÅäÖüĴæÆ÷,µÍ5λΪ¼Ä´æÆ÷µØÖ· #define RD_RX_PLOAD 0x61 //¶ÁRXÓÐЧÊý¾Ý,1~32×Ö½Ú #define WR_TX_PLOAD 0xA0 //дTXÓÐЧÊý¾Ý,1~32×Ö½Ú #define FLUSH_TX 0xE1 //Çå³ýTX FIFO¼Ä´æÆ÷.·¢ÉäģʽÏÂÓà #define FLUSH_RX 0xE2 //Çå³ýRX FIFO¼Ä´æÆ÷.½ÓÊÕģʽÏÂÓà #define REUSE_TX_PL 0xE3 //ÖØÐÂʹÓÃÉÏÒ»°üÊý¾Ý,CEΪ¸ß,Êý¾Ý°ü±»²»¶Ï·¢ËÍ. #define NOP 0xFF //¿Õ²Ù×÷,¿ÉÒÔÓÃÀ´¶Á״̬¼Ä´æÆ÷ //SPI(NRF24L01)¼Ä´æÆ÷µØÖ· #define CONFIG 0x00 //ÅäÖüĴæÆ÷µØÖ·;bit0:1½ÓÊÕģʽ,0·¢Éäģʽ;bit1:µçÑ¡Ôñ;bit2:CRCģʽ;bit3:CRCʹÄÜ; //bit4:ÖжÏMAX_RT(´ïµ½×î´óÖØ·¢´ÎÊýÖжÏ)ʹÄÜ;bit5:ÖжÏTX_DSʹÄÜ;bit6:ÖжÏRX_DRʹÄÜ #define EN_AA 0x01 //ʹÄÜ×Ô¶¯Ó¦´ð¹¦ÄÜ bit0~5,¶ÔӦͨµÀ0~5 #define EN_RXADDR 0x02 //½ÓÊÕµØÖ·ÔÊÐí,bit0~5,¶ÔӦͨµÀ0~5 #define SETUP_AW 0x03 //ÉèÖõØÖ·¿í¶È(ËùÓÐÊý¾ÝͨµÀ):bit1,0:00,3×Ö½Ú;01,4×Ö½Ú;02,5×Ö½Ú; #define SETUP_RETR 0x04 //½¨Á¢×Ô¶¯ÖØ·¢;bit3:0,×Ô¶¯ÖØ·¢¼ÆÊýÆ÷;bit7:4,×Ô¶¯ÖØ·¢ÑÓʱ 250*x+86us #define RF_CH 0x05 //RFͨµÀ,bit6:0,¹¤×÷ͨµÀƵÂÊ; #define RF_SETUP 0x06 //RF¼Ä´æÆ÷;bit3:´«ÊäËÙÂÊ(0:1Mbps,1:2Mbps);bit2:1,·¢É书ÂÊ;bit0:µÍÔëÉù·Å´óÆ÷ÔöÒæ #define STATUS 0x07 //״̬¼Ä´æÆ÷;bit0:TX FIFOÂú±êÖ¾;bit3:1,½ÓÊÕÊý¾ÝͨµÀºÅ(×î´ó:6);bit4,´ïµ½×î¶à´ÎÖØ·¢ //bit5:Êý¾Ý·¢ËÍÍê³ÉÖжÏ;bit6:½ÓÊÕÊý¾ÝÖжÏ; #define MAX_TX 0x10 //´ïµ½×î´ó·¢ËÍ´ÎÊýÖÐ¶Ï #define TX_OK 0x20 //TX·¢ËÍÍê³ÉÖÐ¶Ï #define RX_OK 0x40 //½ÓÊÕµ½Êý¾ÝÖÐ¶Ï #define OBSERVE_TX 0x08 //·¢Ëͼì²â¼Ä´æÆ÷,bit7:4,Êý¾Ý°ü¶ªÊ§¼ÆÊýÆ÷;bit3:0,ÖØ·¢¼ÆÊýÆ÷ #define CD 0x09 //ÔØ²¨¼ì²â¼Ä´æÆ÷,bit0,ÔØ²¨¼ì²â; #define RX_ADDR_P0 0x0A //Êý¾ÝͨµÀ0½ÓÊÕµØÖ·,×î´ó³¤¶È5¸ö×Ö½Ú,µÍ×Ö½ÚÔÚǰ #define RX_ADDR_P1 0x0B //Êý¾ÝͨµÀ1½ÓÊÕµØÖ·,×î´ó³¤¶È5¸ö×Ö½Ú,µÍ×Ö½ÚÔÚǰ #define RX_ADDR_P2 0x0C //Êý¾ÝͨµÀ2½ÓÊÕµØÖ·,×îµÍ×Ö½Ú¿ÉÉèÖÃ,¸ß×Ö½Ú,±ØÐëͬRX_ADDR_P1[39:8]ÏàµÈ; #define RX_ADDR_P3 0x0D //Êý¾ÝͨµÀ3½ÓÊÕµØÖ·,×îµÍ×Ö½Ú¿ÉÉèÖÃ,¸ß×Ö½Ú,±ØÐëͬRX_ADDR_P1[39:8]ÏàµÈ; #define RX_ADDR_P4 0x0E //Êý¾ÝͨµÀ4½ÓÊÕµØÖ·,×îµÍ×Ö½Ú¿ÉÉèÖÃ,¸ß×Ö½Ú,±ØÐëͬRX_ADDR_P1[39:8]ÏàµÈ; #define RX_ADDR_P5 0x0F //Êý¾ÝͨµÀ5½ÓÊÕµØÖ·,×îµÍ×Ö½Ú¿ÉÉèÖÃ,¸ß×Ö½Ú,±ØÐëͬRX_ADDR_P1[39:8]ÏàµÈ; #define TX_ADDR 0x10 //·¢Ë͵ØÖ·(µÍ×Ö½ÚÔÚǰ),ShockBurstTMģʽÏÂ,RX_ADDR_P0Óë´ËµØÖ·ÏàµÈ #define RX_PW_P0 0x11 //½ÓÊÕÊý¾ÝͨµÀ0ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define RX_PW_P1 0x12 //½ÓÊÕÊý¾ÝͨµÀ1ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define RX_PW_P2 0x13 //½ÓÊÕÊý¾ÝͨµÀ2ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define RX_PW_P3 0x14 //½ÓÊÕÊý¾ÝͨµÀ3ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define RX_PW_P4 0x15 //½ÓÊÕÊý¾ÝͨµÀ4ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define RX_PW_P5 0x16 //½ÓÊÕÊý¾ÝͨµÀ5ÓÐЧÊý¾Ý¿í¶È(1~32×Ö½Ú),ÉèÖÃΪ0Ôò·Ç·¨ #define FIFO_STATUS 0x17 //FIFO״̬¼Ä´æÆ÷;bit0,RX FIFO¼Ä´æÆ÷¿Õ±êÖ¾;bit1,RX FIFOÂú±êÖ¾;bit2,3,±£Áô //bit4,TX FIFO¿Õ±êÖ¾;bit5,TX FIFOÂú±êÖ¾;bit6,1,Ñ­»··¢ËÍÉÏÒ»Êý¾Ý°ü.0,²»Ñ­»·; ////////////////////////////////////////////////////////////////////////////////////////////////////////// //24L01²Ù×÷Ïß #define NRF24L01_CE PAout(4) //24L01ƬѡÐźŠ#define NRF24L01_CSN PCout(4) //SPIƬѡÐźŠ#define NRF24L01_IRQ PCin(5) //IRQÖ÷»úÊý¾ÝÊäÈë //24L01·¢ËͽÓÊÕÊý¾Ý¿í¶È¶¨Òå #define TX_ADR_WIDTH 5 //5×ֽڵĵØÖ·¿í¶È #define RX_ADR_WIDTH 5 //5×ֽڵĵØÖ·¿í¶È #define TX_PLOAD_WIDTH 32 //20×Ö½ÚµÄÓû§Êý¾Ý¿í¶È #define RX_PLOAD_WIDTH 32 //20×Ö½ÚµÄÓû§Êý¾Ý¿í¶È void NRF24L01_Init(void);//³õʼ»¯ void RX_Mode(void);//ÅäÖÃΪ½ÓÊÕģʽ void TX_Mode(void);//ÅäÖÃΪ·¢ËÍģʽ u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//дÊý¾ÝÇø u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//¶ÁÊý¾ÝÇø u8 NRF24L01_Read_Reg(u8 reg); //¶Á¼Ä´æÆ÷ u8 NRF24L01_Write_Reg(u8 reg, u8 value);//д¼Ä´æÆ÷ u8 NRF24L01_Check(void);//¼ì²é24L01ÊÇ·ñ´æÔÚ u8 NRF24L01_TxPacket(u8 *txbuf);//·¢ËÍÒ»¸ö°üµÄÊý¾Ý u8 NRF24L01_RxPacket(u8 *rxbuf);//½ÓÊÕÒ»¸ö°üµÄÊý¾Ý #endif
07-14
#include "24l01.h" #include "lcd.h" #include "delay.h" #include "spi.h" const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ· const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ· //³õʼ»¯24L01µÄIO¿Ú void NRF24L01_Init(void) { RCC->APB2ENR|=1<<2; //ʹÄÜPORTA¿ÚʱÖÓ RCC->APB2ENR|=1<<4; //ʹÄÜPORTC¿ÚʱÖÓ GPIOA->CRL&=0XFFF000FF;//PA4Êä³ö GPIOA->CRL|=0X00033300; GPIOA->ODR|=7<<2; //PA2.3.4 Êä³ö1 GPIOC->CRL&=0XFF00FFFF;//PC4Êä³ö PC5Êä³ö GPIOC->CRL|=0X00830000; GPIOC->ODR|=3<<4; //ÉÏÀ­ SPIx_Init(); //³õʼ»¯SPI NRF24L01_CE=0; //ʹÄÜ24L01 NRF24L01_CSN=1; //SPIƬѡȡÏû } //¼ì²â24L01ÊÇ·ñ´æÔÚ //·µ»ØÖµ:0£¬³É¹¦;1£¬Ê§°Ü u8 NRF24L01_Check(void) { u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8 i; SPIx_SetSpeed(SPI_SPEED_8); //spiËÙ¶ÈΪ9Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£© NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//дÈë5¸ö×ֽڵĵØÖ·. NRF24L01_Read_Buf(TX_ADDR,buf,5); //¶Á³öдÈëµÄµØÖ· for(i=0;i<5;i++)if(buf[i]!=0XA5)break; if(i!=5)return 1;//¼ì²â24L01´íÎó return 0; //¼ì²âµ½24L01 } //SPIд¼Ä´æÆ÷ //reg:Ö¸¶¨¼Ä´æÆ÷µØÖ· //value:дÈëµÄÖµ u8 NRF24L01_Write_Reg(u8 reg,u8 value) { u8 status; NRF24L01_CSN=0; //ʹÄÜSPI´«Êä status =SPIx_ReadWriteByte(reg);//·¢ËͼĴæÆ÷ºÅ SPIx_ReadWriteByte(value); //дÈë¼Ä´æÆ÷µÄÖµ NRF24L01_CSN=1; //½ûÖ¹SPI´«Êä return(status); //·µ»Ø×´Ì¬Öµ } //¶ÁÈ¡SPI¼Ä´æÆ÷Öµ //reg:Òª¶ÁµÄ¼Ä´æÆ÷ u8 NRF24L01_Read_Reg(u8 reg) { u8 reg_val; NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä SPIx_ReadWriteByte(reg); //·¢ËͼĴæÆ÷ºÅ reg_val=SPIx_ReadWriteByte(0XFF);//¶ÁÈ¡¼Ä´æÆ÷ÄÚÈÝ NRF24L01_CSN = 1; //½ûÖ¹SPI´«Êä return(reg_val); //·µ»Ø×´Ì¬Öµ } //ÔÚÖ¸¶¨Î»ÖöÁ³öÖ¸¶¨³¤¶ÈµÄÊý¾Ý //reg:¼Ä´æÆ÷(λÖÃ) //*pBuf:Êý¾ÝÖ¸Õë //len:Êý¾Ý³¤¶È //·µ»ØÖµ,´Ë´Î¶Áµ½µÄ״̬¼Ä´æÆ÷Öµ u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len) { u8 status,u8_ctr; NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä status=SPIx_ReadWriteByte(reg);//·¢ËͼĴæÆ÷Öµ(λÖÃ),²¢¶Áȡ״ֵ̬ for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPIx_ReadWriteByte(0XFF);//¶Á³öÊý¾Ý NRF24L01_CSN=1; //¹Ø±ÕSPI´«Êä return status; //·µ»Ø¶Áµ½µÄ״ֵ̬ } //ÔÚÖ¸¶¨Î»ÖÃдָ¶¨³¤¶ÈµÄÊý¾Ý //reg:¼Ä´æÆ÷(λÖÃ) //*pBuf:Êý¾ÝÖ¸Õë //len:Êý¾Ý³¤¶È //·µ»ØÖµ,´Ë´Î¶Áµ½µÄ״̬¼Ä´æÆ÷Öµ u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len) { u8 status,u8_ctr; NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä status = SPIx_ReadWriteByte(reg);//·¢ËͼĴæÆ÷Öµ(λÖÃ),²¢¶Áȡ״ֵ̬ for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPIx_ReadWriteByte(*pBuf++); //дÈëÊý¾Ý NRF24L01_CSN = 1; //¹Ø±ÕSPI´«Êä return status; //·µ»Ø¶Áµ½µÄ״ֵ̬ } //Æô¶¯NRF24L01·¢ËÍÒ»´ÎÊý¾Ý //txbuf:´ý·¢ËÍÊý¾ÝÊ×µØÖ· //·µ»ØÖµ:·¢ËÍÍê³É×´¿ö u8 NRF24L01_TxPacket(u8 *txbuf) { u8 sta; SPIx_SetSpeed(SPI_SPEED_8);//spiËÙ¶ÈΪ9Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£© NRF24L01_CE=0; NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//дÊý¾Ýµ½TX BUF 32¸ö×Ö½Ú NRF24L01_CE=1;//Æô¶¯·¢ËÍ while(NRF24L01_IRQ!=0);//µÈ´ý·¢ËÍÍê³É sta=NRF24L01_Read_Reg(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾ if(sta&MAX_TX)//´ïµ½×î´óÖØ·¢´ÎÊý { NRF24L01_Write_Reg(FLUSH_TX,0xff);//Çå³ýTX FIFO¼Ä´æÆ÷ return MAX_TX; } if(sta&TX_OK)//·¢ËÍÍê³É { return TX_OK; } return 0xff;//ÆäËûÔ­Òò·¢ËÍʧ°Ü } //Æô¶¯NRF24L01·¢ËÍÒ»´ÎÊý¾Ý //txbuf:´ý·¢ËÍÊý¾ÝÊ×µØÖ· //·µ»ØÖµ:0£¬½ÓÊÕÍê³É£»ÆäËû£¬´íÎó´úÂë u8 NRF24L01_RxPacket(u8 *rxbuf) { u8 sta; SPIx_SetSpeed(SPI_SPEED_8); //spiËÙ¶ÈΪ9Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£© sta=NRF24L01_Read_Reg(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾ if(sta&RX_OK)//½ÓÊÕµ½Êý¾Ý { NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//¶ÁÈ¡Êý¾Ý NRF24L01_Write_Reg(FLUSH_RX,0xff);//Çå³ýRX FIFO¼Ä´æÆ÷ return 0; } return 1;//ûÊÕµ½ÈκÎÊý¾Ý } //¸Ãº¯Êý³õʼ»¯NRF24L01µ½RXģʽ //ÉèÖÃRXµØÖ·,дRXÊý¾Ý¿í¶È,Ñ¡ÔñRFƵµÀ,²¨ÌØÂʺÍLNA HCURR //µ±CE±ä¸ßºó,¼´½øÈëRXģʽ,²¢¿ÉÒÔ½ÓÊÕÊý¾ÝÁË void RX_Mode(void) { NRF24L01_CE=0; NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//дRX½ÚµãµØÖ· NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ· NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); //ÉèÖÃRFͨÐÅÆµÂÊ NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ NRF24L01_CE = 1; //CEΪ¸ß,½øÈë½ÓÊÕģʽ } //¸Ãº¯Êý³õʼ»¯NRF24L01µ½TXģʽ //ÉèÖÃTXµØÖ·,дTXÊý¾Ý¿í¶È,ÉèÖÃRX×Ô¶¯Ó¦´ðµÄµØÖ·,Ìî³äTX·¢ËÍÊý¾Ý,Ñ¡ÔñRFƵµÀ,²¨ÌØÂʺÍLNA HCURR //PWR_UP,CRCʹÄÜ //µ±CE±ä¸ßºó,¼´½øÈëRXģʽ,²¢¿ÉÒÔ½ÓÊÕÊý¾ÝÁË //CEΪ¸ß´óÓÚ10us,ÔòÆô¶¯·¢ËÍ. void TX_Mode(void) { NRF24L01_CE=0; NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//дTX½ÚµãµØÖ· NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //ÉèÖÃTX½ÚµãµØÖ·,Ö÷ҪΪÁËʹÄÜACK NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ· NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us + 86us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); //ÉèÖÃRFͨµÀΪ40 NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); //ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e); //ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ,¿ªÆôËùÓÐÖÐ¶Ï NRF24L01_CE=1;//CEΪ¸ß,10usºóÆô¶¯·¢ËÍ }
07-14
#################################################################### ## ## ## ## ## CODE SKELETON v1.0.0 ## ## ## ## TP-LINK ## ## 2013.7.9 ## #################################################################### 1. žÅÊö CODE SKELETONÊÇÌáÈ¡CODEʵÏÖµÄÖ÷Ìå¿òŒÜ¡£ËüžúʵŒÊʵÏÖ»¹Óзdz£ŽóµÄ²î Ÿà¡£·œ±ãŽóŒÒÊìÏ€CODEµÄ¹ŠÄÜ»®·ÖÒÔŒ°ŽóžÅÁËœâÓïÒô¹ŠÄÜÉæŒ°µÄһЩ±à³ÌŒŒÊõ¡£ ËüÖ÷Òª°üº¬menuconfigµÄ»ùŽ¡Ê¹Óá¢MakefileŽîœš¹€³Ì¡¢¶¯Ì¬¿âµÄʹÓᢟ²Ì¬¿â µÄʹÓᢌòµ¥ÖÕ¶ËI/O¡¢»Øµ÷º¯Êý¡¢¶àÏ̱߳à³Ì¡¢socket±à³Ì¡¢Œòµ¥Çý¶¯±à³ÌµÈ ÄÚÈÝ¡£¹ŠÄÜʵÏֱȜώֲڣ¬»¶Ó­¶ÁÕß·áž»CODE SKELETONµÄÄÚÈÝ¡£CODE SKELETON Ö»º­žÇÁËCODEʵÏÖµÄÒ»²¿·ÖÄÚÈÝ£¬Èç¹û¶ÁÕß¶ÔÓïÒôÄÚÈÝÓÐÐËÈ€¿ÉÒÔœøÒ»²œÑ§Ï° ºÍÉºóÎIJοŒ×ÊÁϵÄÄÚÈÝ¡£ 2. ¿òŒÜ CODE SKELETON°üÀšÈýžöÄ£¿é£ºÄÚºËÄ£¿é£š×Ö·ûÇý¶¯simple£©£¬·þÎñŽŠÀíÖÐ ÐÄ£šcs_server)ºÍ·þÎñÇëÇó¿Í»§¶Ë£šcs_client£©¡£cs_clientÒÔÃüÁîÐеķœÊœ œÓÊÜÓû§µÄÇëÇ󣬞ùŸÝÃüÁîÔÙÍš¹ýsocket°ÑÃüÁË͵œcs_server, cs_server ŽŠÀíºó·µ»ØÖŽÐМá¹ûžøcs_client¡£Œòµ¥œá¹¹ÍŒÈçÏÂËùÊŸ¡£ *--------* *-----------* *---------* | | | | | | | simple |<----------->| server |<---------->| client | | | | | | | *--------* *-----------* *---------* server ºÍ client Ä£¿éŸùʹÓÃÁœžöÄ£¿é£¬mini_shellºÍsocketÄ£¿é¡£Ç°Õß ·â×°ÖÕ¶ËI/OºÍ»Øµ÷º¯Êý±í¡£ºóÕß·â×°unixÓòÌלÓ×ÖÓÃÓÚœø³ÌŒäÍšÐÅ¡£ 3. ĿŒœá¹¹ TOP [code skeleton¶¥²ãĿŒ] | *---> readme [±ŸÎĵµ *-*] | *---> build [¹€³Ì±àÒë»·Ÿ³] | *---> config [ÅäÖÃĿŒ£¬µ±Ç°Ö»ÓÐmenuconfig] | *---> install [¹€³Ì±àÒëºóÉú³ÉµÄʹÓÃÎÄŒþ] | *---> code [ÔŽŽúÂë] | *---> modules [ÄÚºËÄ£¿é] | | | *---> simple [Œòµ¥×Ö·ûÇý¶¯ÊµÏÖ] | *---> apps [Óû§²ãŽúÂë] | *---> inc [¹«ÓÃÍ·ÎÄŒþ] | *---> cs_libs [¿âÎÄŒþ] | | | *---> mini_shell | | | *---> socket | *---> cs_server | *---> cs_client 4. ʹÓòœÖè 4.1 ÅäÖù€³Ì œøÈëTOP/buildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£#ÊÇlinux shellÌáÊŸ·û£¬²»ÊôÓÚÃüÁ·Ö£¬ ºóÐøŸùÏàͬº¬Òå¡£Èç¹û²»ÊäÈëMODEL=xxx, ĬÈÏʹÓÃMODEL=TEST¡£ÅäÖÃÍê³Éºó±£ŽæÅä ÖÃÐÅÏ¢¡£ # make MODEL=xxx menuconfig 4.2 ±àÒë¹€³Ì ŒÌÐøÍ£ÁôÔÚbuildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£ # make MODEL=xxx /* MODEL=xxx¿ÉÒÔ²»ÊäÈ룬ĬÈÏʹÓÃMODEL=TEST */ ÁíÍ⣬±àÒëʱ¿ÉÒÔÊäÈë²ÎÊýÀŽŸö¶šÊÇ·ñÆô¶¯µ÷ÊÔ¿ª¹ØŒ°µ÷ÊԵȶ±ð£¬ÈçÏÂÃüÁî # make MODEL=xxx VSDEBUG=yyy /* ÆäÖÐyyy¿ÉÒÔȡֵ error, sys, info, debugl, debugm, debugh£¬Ä¬ÈÏΪerror */ 4.3 ÔËÐгÌÐò ÏÂÃæµÄ²Ù×÷ŸùÔÚ TOP/installĿŒÏ¡£ 4.3.1 ŒÓÔØÇý¶¯ ŒÓÔØŒòµ¥×Ö·ûÇý¶¯simple£¬ÊäÈëÏÂÃæÃüÁî¡£ # insmod csmsimple.ko # cd /dev # mknod -m 666 csmsimple c 220 0 # cd - 4.3.2 Æô¶¯cs_server Èç¹û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç¹û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_server & 4.3.3 Æô¶¯cs_client Èç¹û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç¹û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_client È»ºó¿ÉÒÔœøÈëÃüÁîÐÐģʜ£º[ code skeleton client ] # ¡£Æô¶¯Íê³É¡£ 5. ÍØÕ¹ µ±Ç°°æ±ŸÏµÍ³±ÈœÏŽÖ²Ú£¬»¶Ó­¶ÁÕßÍêÉÆ±ŸÏµÍ³¡£ŽóÖÂÂÞÁÐÐèÒªÍêÉÆµÄµØ·œ¡£ 1£©ÖÕ¶ËI/O£» 2£©ÃüÁîÐÐģʜµÄÀúÊ·ŒÇÂŒ¡¢×Ô¶¯Æ¥Å䣻 3£©Çý¶¯µÄÄں˶šÊ±Æ÷»òÕßÄÚºËÏ̲߳úÉúÊÂŒþʵÏÖclientµÄ׎̬Çл»£¬Íê³ÉÒ»žö СÐ͵Ä׎̬»ú£» 4£©Ïß³Ìͬ²œÊµÏÖ£» 5£©ÓŠÓòãŽúÂëºÍÄںˎúÂëµ÷ÊÔŒŒÊõ£» 6£©clientÌíŒÓžüÓÐÈ€µÄÃüÁî¡£ 6. ²Î¿Œ×ÊÁÏ [1] rfc3261, J. RosenbergµÈ, 2002 [2] Understanding the Session Initiation Protocol (Third Edition), Alan B.Johnston, 2009 [3] LinuxÉ豞Çý¶¯³ÌÐò [4] LinuxÍøÂ簲ȫŒŒÊõÓëʵÏÖ(µÚ¶þ°æ), ³ÂÓÂÑ«, Ç廪Žóѧ³ö°æÉç [5] Unix»·Ÿ³žßŒ¶±à³Ì [6] pjsip¹ÙÍø [7] netfilter¹ÙÍø 7. ·ŽÀ¡ÐÅÏ¢ »¶Ó­ŽóŒÒ·ŽÀ¡ÐÅÏ¢µœ zhonglianbo@tp-link.net¡£ 为什么我的readme是这杨的
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值