/** ****************************************************************************** **说明:003项目写码程序 **功能:答题卡写码 **作者:Bruce **日期:2017.6.8 ****************************************************************************** **/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "printf.h" #include "USART2.h" #include "LED.h" #include "delay.h" #include "nrf24L01.h" #include "DataProc.h" #include "tim.h" #include "flash.h" #include "LCD.h" /* Functions ---------------------------------------------------------*/ void RCC_Configuration(void); void NVIC_Configuration(void); void IWDG_Init(u8 prer,u16 rlr); void IWDG_Feed(void); extern unsigned char txBuf[32]; extern u8 protocol_config_flg; extern u8 first_clear_flag; #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) #define SYSCLK_FREQ_24MHz 24000000 #else #define SYSCLK_FREQ_72MHz 72000000 #endif /** @addtogroup STM32F10x_StdPeriph_Template * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /** * @brief Main program. * @param None * @retval None */ #if 1 #define SCAN_ADDRESS (unsigned char*)"\x34\x43\x10\x10\x01" #define SCAN_SETUPVALUE 0x07 #define SCAN_TX_ADR_WIDTH (5) //3??????? #define SCAN_RX_ADR_WIDTH (5) //3??????? #define SCAN_RX_PLOAD_WIDTH (10) //32????????? #define SCAN_TX_PLOAD_WIDTH (10) //32????????? #define SCAN_RF_CRC (0x00) #define SCAN_RF_ENAA (0x01) #define SCAN_TX_CHNL (40) //??????1 #define SCAN_RX_CHNL (40) //??????2 #define SCAN_DYNPD (0x01) #define SCAN_FEATURE (0x07) void NRF24L01_TELPO_RX_Mode(SPIType spiNum,unsigned char* addr, unsigned char addrlen, unsigned char rf_channel, unsigned char rf_setup, unsigned char rf_crc, unsigned char rf_enaa, unsigned char len, unsigned char dynpd, unsigned char feature) { NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+SETUP_AW,addrlen - 2);//???? --3?? NRF24L01_Write_Buf(spiNum,NRF_WRITE_REG+RX_ADDR_P0,(u8*)addr,addrlen);//?RX???? NRF24L01_Write_Buf(spiNum,NRF_WRITE_REG+TX_ADDR,(u8*)addr,addrlen);//?TX???? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+EN_AA,rf_enaa); //????0????? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+EN_RXADDR,0x01);//????0????? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+RF_CH,rf_channel); //??RF???? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+RF_SETUP,rf_setup);//??TX????,0db??,1Mbps,??????? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+RX_PW_P0,len);//????0??????? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+CONFIG, (0x3b | rf_crc));//???????????;PWR_UP,EN_CRC,16BIT_CRC,???? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+DYNPD,dynpd); NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+FEATURF,feature); NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+STATUS,0x70); //??TX_DS?MAX_RT???? NRF24L01_Write_Reg(spiNum,FLUSH_RX,0xff); //??RX FIFO??? } void NRF24L01_RX_TelPo_CONFIG1(SPIType spiNum) { if(spiNum == SPI_PORT1){ SPI1_CE =0; }else{ SPI2_CE=0; } NRF24L01_TELPO_RX_Mode(spiNum,SCAN_ADDRESS,SCAN_RX_ADR_WIDTH,SCAN_RX_CHNL, SCAN_SETUPVALUE,SCAN_RF_CRC,SCAN_RF_ENAA, SCAN_RX_PLOAD_WIDTH,SCAN_DYNPD,SCAN_FEATURE); if(spiNum == SPI_PORT1){ //CE为高,进入接收模式 SPI1_CE =1; }else{ SPI2_CE=1; } } #endif u8 NRF24L01_RxPacket1(SPIType spiNum,u8 *rxbuf,unsigned char rxLen) { u8 sta; SPI_SetSpeed(spiNum,SPI_BaudRatePrescaler_16); //SPI_SetSpeed(spiNum,SPI_BaudRatePrescaler_8); //spi???9Mhz(24L01???SPI???10Mhz) sta=NRF24L01_Read_Reg(spiNum,STATUS); //????????? if(sta&RX_OK)//????? { NRF24L01_Read_Buf(spiNum,RD_RX_PLOAD,rxbuf,rxLen); //???? NRF24L01_Write_Reg(spiNum,FLUSH_RX,0xff); //??RX FIFO??? NRF24L01_Write_Reg(spiNum,NRF_WRITE_REG+STATUS,sta); //??TX_DS?MAX_RT???? delay_5us(20); return 0; } return 1;//??????? } int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ //SCB->VTOR = FLASH_BASE | 0x10000; /* Vector Table Relocation in Internal FLASH. */ RCC_Configuration(); //系统时钟设置 NVIC_Configuration(); //中断向量配置 IWDG_Init(4,625); //(4*2^4)*625/40 ms = 1s 看门狗定时1s IWDG_Feed(); TIM3_Int_Init(9,7199); led_init(); //LED IO配置 #if LCD lcd_init(); //LCD 配置 AttenuatorConfig(); //衰减器配置 #endif USART_Configuration(); //串口1、3初始化配置 串口1波特率为115200 串口3波特率为4800 USART2_Init(115200); //串口2初始化 波特率为115200 Debug NRF24L01_Init(); //24L01 IO配置 IWDG_Feed(); // while(NRF24L01_Check(SPI_REV)){ //检测NRF24L01 1是否存在 // printf("The 2.4G Error!"); // } #if 1 while(NRF24L01_Check(SPI_SEND)){ //检测NRF24L01 2是否存在 printf("The 2.4G Error!"); } #endif Data_Init(); //包数据初始化 IWDG_Feed(); led0=~led0; delay_ms(200); led0=~led0; DegugPrintf("123456",6); SendUSART2Str("\n"); IWDG_Feed(); #if 0 while(1) { NRF24L01_RX_TelPo_CONFIG1(SPI_SEND); while(1) { u8 Rx_Buffer[32] = {0}; if (!NRF24L01_RxPacket1(SPI_SEND,Rx_Buffer,sizeof(Rx_Buffer))) { break; } IWDG_Feed(); } IWDG_Feed(); } #endif printf("\nPC对码软件通用版本V2.4-20190906\n"); // SendUartData("123456",6,USART2); // printf("System Clock = %d\r\n",SystemCoreClock); NRF24L01_RX_Mode(SPI_SEND); // NRF24L01_RX_Mode_NOACK(SPI_SEND); //while(1) //{ // RF24_CarrierTest(SPI_SEND,32); // delay_ms(100); // IWDG_Feed(); //} #if 1 Readpara_from_flash(); //读出数据并打印出来 protocol_config_flg = Save_Buffer[2*0]; switch(protocol_config_flg) { case 0: { printf("江西协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"JIANGXI",7); #endif break; } case 1: { printf("天波协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"TELPO",5); #endif break; } case 2: { printf("云南协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"YUNNAN",6); #endif break; } case 3: { printf("贵州协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"GUIZHOU",7); #endif break; } case 4: { printf("四川协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"SICHUAN",7); #endif break; } case 5: { printf("内蒙古协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"NEIMENGGU",9); #endif break; } case 6: { printf("安徽协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"ANHUI",5); #endif break; } case 7: { printf("山西鑫诺协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"SHANXI",6); #endif break; } case 8: { printf("VCOM测试\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"VCOM",4); #endif break; } case 9: { printf("辽宁电信\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"LIAONING.DIAN",13); #endif break; } case 10: { printf("辽宁移动\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"LIAONING.YI",11); #endif break; } case 11: { printf("Tp专用协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"TP",2); #endif break; } case 12: { printf("内蒙古移动协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"NEIMENGGU.YI",12); #endif break; } case 13: { printf("广西移动协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"GUANGXI.YI",10); #endif break; } case 14: { printf("四川电信协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"SICHUN.DIAN",11); #endif break; } case 15: { printf("福建真灼协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"FUJIANZHENZHUO",14); #endif break; } case 16: { printf("苏州木兰协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"SUZHOUMULANG",10); #endif break; } case 17: { printf("重庆移动协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"CHONGQIN.YI",11); #endif break; } case 18: { printf("山西移动协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"SHANXI.YI",9); #endif break; } case 19: { printf("甘肃移动协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"GANSU.YI",9); #endif break; } case 20: { printf("信达丰协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"XDF",3); #endif break; } case 21: { printf("德海协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"DH",2); #endif break; } case 22: { printf("安徽电信协议\r\n"); #if LCD vDispClearLine(1); vDispStr(1,1,"AHDX",4); #endif break; } } #endif #if 0 NRF24L01_RX_TelPo_CONFIG1(SPI_SEND); while(1) { u8 Rx_Buffer[32] = {0}; if (!NRF24L01_RxPacket(SPI_SEND,Rx_Buffer)) { break; } } #endif /* Infinite loop */ //SendConsoleByte(protocol_config_flg); //回显,返回给PC端 //NRF24L01_RX_Mode_NOACK_VCOM(SPI_SEND); first_clear_flag = 1; delay_ms(50); while (1) { // while(1) // // { // if(DataProc_A4_nrf()) // break; // } DataProc_1356(); //13.56M数据处理 #if LCD DataProc_RecNrf24L01(); #endif DataProc_USART1(); //串口1数据处理,与PC端软件通信 // DataProc_Nrf24l01_SPI2(); } } void RCC_Configuration(void) { #if 0 ErrorStatus HSEStartUpStatus; //枚举变量,定义高速时钟的启动状态 RCC_DeInit(); //RCC系统重置,用于Debug RCC_HSEConfig(RCC_HSE_ON); //使能高速时钟源HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE稳定 if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){} RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08){} } RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB , ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); #else RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Select AHB clock(HCLK) as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* SysTick interrupt each 10ms with HCLK equal to 72MHz */ SysTick_Config(240000); #endif } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //设置串口2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //设置串口3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //设置定时器3全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); } /* *看门狗初始化函数 *prer:分频数:0-7,低3位有效 *分频因子:4*2^prer,最大256 *rlr:重装载寄存器值,低11位有效 *Tout=((4*2^prer)*rlr)/40 (ms) */ void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能对寄存器IWDG_PR和IWDG_RLR的操作 IWDG_SetPrescaler(prer); //设置IWDG预分频值:prer IWDG_SetReload(rlr); //设置IWDG重载值 IWDG_ReloadCounter(); //按照设置值,重载IWDG计数器 IWDG_Enable(); //使能IWDG } /** * 喂狗 */ void IWDG_Feed(void) { IWDG_ReloadCounter(); /*reload*/ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/