/* @NOT_ACT_USED :@NEED_CHECK_FUNC void tuner_config_power_on(void) void tuner_config_power_reset(void) */ /****************************************************************************** 版权所有 (C), 2001-2011, 上海全波通信技术有限公司 ****************************************************************************** 文 件 名 : sys_config.c 版 本 号 : 初稿 作 者 : 郭金涛 生成日期 : 2013年6月3日 最近修改 : 功能描述 : 系统配置函数 函数列表 : timer_init uart_com_init watchdog_init 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 创建文件 ******************************************************************************/ #include #include "type.h" #include "sys_config.h" #include "os_task.h" #include "delay.h" #include "rtc.h" #include "lcd_task.h" #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #if 0 //#include "misc.h" //#include "stm32f4xx_exti.h" //#include "stm32f4xx_gpio.h" #endif #define SYS_DEV_UNIQUE_ID_L ((uint32_t)0x1FFF7A10) #define SYS_DEV_UNIQUE_ID_H ((uint32_t)0x1FFF7A14) SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi2; EXTI_HandleTypeDef hexti; WWDG_HandleTypeDef hwwdg; #if USE_ETH_DBG s_USR_DBG_ETH udbg_eth={0}; void inc_eth_dbg_cnt(en_USR_ETH_DBG type) { switch(type) { case USR_ETH_INT: udbg_eth.eth_int_in_cnt++; break; case USR_ETH_RECV_SEM: udbg_eth.eth_recv_sem_cnt++;//ethernetif_input break; case USR_ETH_RECV_TCPIP: udbg_eth.eth_recv_tcpip_cnt++;//tcpip_input ethernet_input break; case USR_ETH_IP4_INPUT://ip4_input udbg_eth.eth_ip4_in_cnt++; break; case USR_ETH_TCP_INPUT://tcp_input udbg_eth.eth_tcp_in_cnt++; break; case USR_ETH_UDP_INPUT: udbg_eth.eth_udp_in_cnt++; break; case USR_ETH_ICMP_INPUT: udbg_eth.eth_icmp_in_cnt++; break; case USR_ETH_TCP_LISTEN: udbg_eth.eth_tcp_listen_cnt++;//tcp_listen_input break; case USR_ETH_HTTP_ACCEPT://http_accept udbg_eth.eth_http_accept_c++; break; case USR_ETH_HTTP_RECV://http_recv udbg_eth.eth_http_recv_c++; break; case USR_ETH_HTTP_PARSE://http_parse_request udbg_eth.eth_http_parse_c++; break; case USR_ETH_HTTP_SEND://http_sent udbg_eth.eth_http_send_c++; break; case USR_ETH_TCP_OUT://tcp_output udbg_eth.eth_tcp_out_c++; break; case USR_LVL_INPUT_ERR://tcp_output udbg_eth.low_level_in_alloc_err++; break; case USR_MEMP_TCP_SEG_RESET: udbg_eth.memp_tcp_seg_reset_c++; break; default:break; } } #endif #if I2C_SOFT_GPIO //软件模拟,不使用mutex,直接关中断 extern S_I2C_GPIO i2c_gpio[]; #endif extern MUTEX_HANDLE i2c_mutex[]; extern void delay_us(uint32 nus); extern void Error_Handler(void); //获取当前芯片的序列ID(低32bit) uint32 sys_get_dev_unique_id(void) { return *(__IO uint32 *) SYS_DEV_UNIQUE_ID_L; } //初始化GPIO,包括使能和时钟 void sys_gpio_init(void) { /*RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); } //初始化内部RCC组件,包括使能和时钟配置 void sys_rcc_init(void) { //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); __HAL_RCC_SYSCFG_CLK_ENABLE(); } //初始化外围器件,包括使能和时钟 void sys_peripheral_clk_init(void) { } void sys_pvd_init(void) { EXTI_ConfigTypeDef ExtiConfig; PWR_PVDTypeDef sConfigPVD; /* NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //置为最高优先级 NVIC_Init(&NVIC_InitStructure); */ __HAL_RCC_PWR_CLK_ENABLE(); HAL_NVIC_SetPriority(PVD_IRQn, 0, 0); HAL_NVIC_EnableIRQ(PVD_IRQn); /* EXTI_ClearITPendingBit(EXTI_Line16); EXTI_InitStructure.EXTI_Line = EXTI_Line16; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //只检测上升沿(掉电) EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); PWR_PVDLevelConfig(PWR_PVDLevel_4); //Enable the PVD Output PWR_PVDCmd(ENABLE); */ #if 1//_USE_RVL_ //上升沿触发回调是否应该直接定义 #endif hexti.Line = EXTI_LINE_16; HAL_EXTI_ClearPending(&hexti, EXTI_TRIGGER_RISING); ExtiConfig.Line = EXTI_LINE_16; ExtiConfig.Mode = EXTI_MODE_INTERRUPT; ExtiConfig.Trigger = EXTI_TRIGGER_RISING; HAL_EXTI_SetConfigLine(&hexti, &ExtiConfig); PWR_PVDLevelConfig(PWR_PVDLEVEL_4);//HAL_PWR_ConfigPVD(&sConfigPVD); HAL_PWR_EnablePVD(); } void PVD_IRQ_Handler(void) { #if 1//_USE_RVL_ //实际情况不一定全是系统关闭. 后续在增加逻辑判断 //if(EXTI_GetITStatus(EXTI_LINE_16) != RESET)//EXTI_Line16 if(HAL_EXTI_GetPending(&hexti,EXTI_LINE_16) != RESET)//EXTI_Line16 { rtc_update_close_time(); //EXTI_ClearITPendingBit(EXTI_Line16); hexti.Line = EXTI_LINE_16; HAL_EXTI_ClearPending(&hexti, EXTI_TRIGGER_RISING); } #endif } //-------------------->>>--------------------- void WWDG_IRQHandler(void) { #if WATCHDOG_ENABLE os_int_enter(); os_dead_wwdg(); os_int_exit(); #else //走不到这. #endif } #if WATCHDOG_ENABLE void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg) { static uint16 test=0; test++; os_dead_wwdg(); test = test+20; } //看门狗用那个 IWDG 还是WWDG? void watchdog_init(void) { /*RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); WWDG_SetPrescaler(WWDG_Prescaler_8); //单周期780us WWDG_SetWindowValue(0x7f-7); //由tick中断喂狗,1个tick喂一次10ms 780*7 =5ms左右 WWDG_EnableIT(); //最大喂狗周期,780*64 =49.9ms 最小喂狗周期 780*7 = 5ms DBGMCU_APB1PeriphConfig(DBGMCU_WWDG_STOP,ENABLE); //为了方便调试,进入debug模式时,WWDG时钟挂起. WWDG_Enable(0x7f);*/ __HAL_RCC_WWDG_CLK_ENABLE(); //hwwdg.EwiCallback = WWDG_IRQHandler;//Reset call back hwwdg.Instance = WWDG; hwwdg.Init.Counter = 0x7f-7; hwwdg.Init.Window = 0x7f-7; hwwdg.Init.Prescaler = WWDG_PRESCALER_8; hwwdg.Init.EWIMode = WWDG_EWI_ENABLE; #if 1//_USE_RVL_ HAL_WWDG_Init(&hwwdg); #endif __HAL_WWDG_ENABLE_IT(&hwwdg,WWDG_IT_EWI); __HAL_DBGMCU_FREEZE_WWDG(); __HAL_WWDG_ENABLE(&hwwdg); } #endif //--------------------<<<--------------------- TIM_HandleTypeDef htim5; extern uint32_t SystemCoreClock; //创建一个1ms定时器,用于检测串口报文等 uint32 create_uart_timer(void) { uint32 reload; TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; __HAL_RCC_TIM5_CLK_ENABLE();//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); HAL_NVIC_SetPriority(TIM5_IRQn, 13 ,0); HAL_NVIC_EnableIRQ(TIM5_IRQn); reload = ((SystemCoreClock/2) /1000) - 1; //周期1ms htim5.Instance = TIM5; htim5.Init.Period = reload; htim5.Init.Prescaler = 0; htim5.Init.ClockDivision = 0; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if(HAL_TIM_Base_Init(&htim5) == HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_OnePulse_Init(&htim5, TIM_OPMODE_REPETITIVE) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* Start the TIM time Base generation in interrupt mode */ HAL_TIM_Base_Start_IT(&htim5); return 0; } UART_HandleTypeDef husart[UART_PORT_NUM]; static S_UART_RX_CTRL uart_ctrl[UART_PORT_NUM]; static USART_TypeDef* COM_USART[UART_PORT_NUM] = {USART1,USART2,USART6,USART3}; static uint8 NVIC_UART_IRQ[UART_PORT_NUM] = {USART1_IRQn,USART2_IRQn,USART6_IRQn,USART3_IRQn}; /*********************************串口部分配置函数**************************************/ /* 串口硬件连接说明: 序号 对应硬件原理图上的名称 芯片管脚 TX RX 0 USART1 PB6, PB7 GPS 1 UART2 .. PD5, PD6 RS232 2 UART6 .. PC6, PC7 J1 RS485 PC8为控制管脚 3 USART3 PD8, PD9 连接外部dryloop */ /***************************************************************************** 函 数 名 : uart_init_hw 功能描述 : 初始化串口底层 输入参数 : void 输出参数 : 无 返 回 值 : static 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ static uint32 uart_init_bsp(uint32 port,UART_InitTypeDef* puart_init,uint32 int_sw) { static const uint32 COM_TX_PORT_CLK[UART_PORT_NUM] = { RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOD,RCC_AHB1Periph_GPIOC,RCC_AHB1Periph_GPIOD}; static const uint32 COM_RX_PORT_CLK[UART_PORT_NUM] = { RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOD,RCC_AHB1Periph_GPIOC,RCC_AHB1Periph_GPIOD}; static const uint32 COM_USART_CLK[UART_PORT_NUM] = { RCC_APB2Periph_USART1,RCC_APB1Periph_USART2,RCC_APB2Periph_USART6,RCC_APB1Periph_USART3}; static GPIO_TypeDef* COM_TX_PORT[UART_PORT_NUM] = {GPIOB,GPIOD,GPIOC,GPIOD}; static GPIO_TypeDef* COM_RX_PORT[UART_PORT_NUM] = {GPIOB,GPIOD,GPIOC,GPIOD}; static const uint16 COM_TX_PIN[UART_PORT_NUM] = {GPIO_Pin_6,GPIO_Pin_5, GPIO_Pin_6,GPIO_Pin_8}; static const uint16 COM_RX_PIN[UART_PORT_NUM] = {GPIO_Pin_7,GPIO_Pin_6, GPIO_Pin_7,GPIO_Pin_9}; static const uint16 COM_TX_PIN_SOURCE[UART_PORT_NUM] = {GPIO_PinSource6,GPIO_PinSource5, GPIO_PinSource6,GPIO_PinSource8}; static const uint16 COM_RX_PIN_SOURCE[UART_PORT_NUM] = {GPIO_PinSource7,GPIO_PinSource6, GPIO_PinSource7,GPIO_PinSource9}; //static const uint16 COM_AF[UART_PORT_NUM] = {GPIO_AF_USART1,GPIO_AF_USART2,GPIO_AF_USART6,GPIO_AF_USART3}; static const uint16 COM_AF[UART_PORT_NUM] = {GPIO_AF7_USART1,GPIO_AF7_USART2,GPIO_AF8_USART6,GPIO_AF7_USART3}; GPIO_InitTypeDef GPIO_InitStructure; //NVIC_InitTypeDef NVIC_InitStructure; //串口时钟使能 RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[port] | COM_RX_PORT_CLK[port], ENABLE); if((port==0)||(port==2)) { RCC_APB2PeriphClockCmd(COM_USART_CLK[port], ENABLE); } else { RCC_APB1PeriphClockCmd(COM_USART_CLK[port], ENABLE); } //RS485控制引脚配置 if(port==2) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pin = GPIO_Pin_8; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_ResetBits(GPIOC,GPIO_Pin_8); } //GPIO_PinAFConfig(COM_TX_PORT[port], COM_TX_PIN_SOURCE[port], COM_AF[port]); //GPIO_PinAFConfig(COM_RX_PORT[port], COM_RX_PIN_SOURCE[port], COM_AF[port]); //串口收发引脚配置 GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pin = COM_TX_PIN[port]; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Alternate = COM_AF[port]; HAL_GPIO_Init(COM_TX_PORT[port], &GPIO_InitStructure); GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pin = COM_RX_PIN[port]; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Alternate = COM_AF[port]; HAL_GPIO_Init(COM_RX_PORT[port], &GPIO_InitStructure); //串口基本参数配置 husart[port].Instance = COM_USART[port]; husart[port].Init.BaudRate = puart_init->BaudRate; husart[port].Init.WordLength = puart_init->WordLength; husart[port].Init.StopBits = puart_init->StopBits; husart[port].Init.Parity = puart_init->Parity; husart[port].Init.Mode = puart_init->Mode; husart[port].Init.HwFlowCtl = puart_init->HwFlowCtl; husart[port].Init.OverSampling= puart_init->OverSampling; __HAL_USART_DISABLE(&husart[port]);//USART_Cmd(COM_USART[port], DISABLE); HAL_UART_Init(&husart[port]); //串口中断配置 if(int_sw) { /*NVIC_InitStructure.NVIC_IRQChannel = NVIC_UART_IRQ[port]; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(COM_USART[port], USART_IT_RXNE, ENABLE); //开启接收中断. */ HAL_NVIC_SetPriority(NVIC_UART_IRQ[port], 13, 0); HAL_NVIC_EnableIRQ(NVIC_UART_IRQ[port]); __HAL_UART_ENABLE_IT(&husart[port],UART_IT_RXNE); } /* Enable USART */ __HAL_USART_ENABLE(&husart[port]);//USART_Cmd(COM_USART[port], ENABLE); return ERR_NO_ERR; } /***************************************************************************** 函 数 名 : uart_com_init 功能描述 : 初始化串口 输入参数 : uint32 com_num 串口号 uint32 baud 波特率 uint32 verify 只可配置奇偶校验 其他固定 uint32 int_sw 配置中断开关 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ uint32 uart_com_init(uint32 com_num,uint32 baud,UART_PARITY verify,uint32 int_sw) { #if 1//_USE_RVL_ //static const uint32 parity[3] = {USART_Parity_No,USART_Parity_Even,USART_Parity_Odd}; static const uint32 parity[3] = {USART_PARITY_NONE,USART_PARITY_EVEN,USART_PARITY_ODD}; UART_InitTypeDef UART_InitStructure; if(com_num>=UART_PORT_NUM) return ERR_NO_ERR; if((uint32)verify>2) verify = PARITY_NO; if(int_sw>1) int_sw = 0; uart_ctrl[com_num].valid = 1; //是否需要判断 中断使能与否? get_current_task_id(&uart_ctrl[com_num].task_id); if (uart_ctrl[com_num].mutex == NULL) { uart_ctrl[com_num].mutex = create_mutex(); if(uart_ctrl[com_num].mutex==NULL) { return ERR_CREATE_MUTEX_FAILED; } } UART_InitStructure.BaudRate = baud; UART_InitStructure.WordLength = USART_WORDLENGTH_8B; UART_InitStructure.StopBits = USART_STOPBITS_1; UART_InitStructure.Parity = parity[(uint32)verify]; UART_InitStructure.Mode = USART_MODE_TX_RX; UART_InitStructure.HwFlowCtl = UART_HWCONTROL_NONE; UART_InitStructure.OverSampling = UART_OVERSAMPLING_16; //USART_InitStructure.HardwareFlowControl = USART_HardwareFlowControl_None; //默认关闭 return uart_init_bsp(com_num,&UART_InitStructure,int_sw); #endif//_USE_RVL_ } uint32 uart_com_init_task_id(uint32 com_num,uint32 baud,UART_PARITY verify,uint32 int_sw,uint32 task_id) { static const uint32 parity[3] = {USART_PARITY_NONE,USART_PARITY_EVEN,USART_PARITY_ODD}; static UART_InitTypeDef UART_InitStructure; if(com_num>=UART_PORT_NUM) return ERR_NO_ERR; if((uint32)verify>2) verify = PARITY_NO; if(int_sw>1) int_sw = 0; uart_ctrl[com_num].valid = 1; //是否需要判断 中断使能与否? uart_ctrl[com_num].task_id = task_id; if(uart_ctrl[com_num].mutex == NULL) { uart_ctrl[com_num].mutex = create_mutex(); if(uart_ctrl[com_num].mutex==NULL) { return ERR_CREATE_MUTEX_FAILED; } } //串口配置 UART_InitStructure.BaudRate = baud; UART_InitStructure.WordLength = USART_WORDLENGTH_8B; UART_InitStructure.StopBits = USART_STOPBITS_1; UART_InitStructure.Parity = parity[(uint32)verify]; //USART_InitStructure.HardwareFlowControl = USART_HardwareFlowControl_None; //默认关闭 UART_InitStructure.Mode = USART_MODE_TX_RX; UART_InitStructure.HwFlowCtl = UART_HWCONTROL_NONE; UART_InitStructure.OverSampling = UART_OVERSAMPLING_16; return uart_init_bsp(com_num,&UART_InitStructure,int_sw); } static void uart2_set_send_control(void) { GPIO_SetBits(GPIOC,GPIO_Pin_8); //发送时,高电平 } static void uart2_clear_send_control(void) { GPIO_ResetBits(GPIOC,GPIO_Pin_8); } void uart_send_string(uint32 port,const uint8 *pbuf,uint32 len) { #if 1//_USE_RVL_ if(port>UART_PORT_NUM) return; if((!pbuf)||(!len)) return; take_mutex(uart_ctrl[port].mutex); if(port==2) { uart2_set_send_control(); } #if USE_STD_USART_SEND_RECV while(len--) { USART_SendData(COM_USART[port], *pbuf++); //while (USART_GetFlagStatus(COM_USART[port], USART_FLAG_TC) == RESET) while(__HAL_UART_GET_FLAG(&husart[port], UART_FLAG_TC) == RESET) { ; } } #else HAL_USART_Transmit(&husart[port], (uint8_t*)pbuf, len, HAL_MAX_DELAY); #endif if(port==2) { uart2_clear_send_control(); } give_mutex(uart_ctrl[port].mutex); #endif } //任务起来前,要先执行此函数,将485口配置为输入状态.防止串口初始化前一直处于输出状态,影响485总线 void uart_hw_pre_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pin = GPIO_PIN_8; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); uart2_clear_send_control(); } #if USE_DEBUG_UART void debug_uart_init(void) { uart_com_init(DEBUG_UART,115200,PARITY_NO,INT_OFF); //调试串口,初始化为115200,无奇偶校验,无中断 } #endif /***************************************************************************** 函 数 名 : fputc 功能描述 : 实现printf的接口函数 输入参数 : int ch FILE *f 输出参数 : int ch 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ int fputc(int ch, FILE *f) { char ch_r='\r'; #if USE_DEBUG_UART #if USE_STD_USART_SEND_RECV if(ch=='\n') { USART_SendData(COM_USART[DEBUG_UART],'\r'); //while (USART_GetFlagStatus(COM_USART[DEBUG_UART], USART_FLAG_TC) == RESET) while(__HAL_UART_GET_FLAG(&husart[DEBUG_UART], UART_FLAG_TC) == RESET) { ; } } USART_SendData(COM_USART[DEBUG_UART],ch); //while (USART_GetFlagStatus(COM_USART[DEBUG_UART], USART_FLAG_TC) == RESET) while (__HAL_UART_GET_FLAG(&husart[DEBUG_UART], UART_FLAG_TC) == RESET) { ; } #else if(ch=='\n') { HAL_USART_Transmit(&husart[DEBUG_UART], (uint8_t*)&ch_r, 1, HAL_MAX_DELAY); } HAL_USART_Transmit(&husart[DEBUG_UART], (uint8_t*)&ch, 1, HAL_MAX_DELAY); #endif #endif return ch; } /***************************************************************************** 函 数 名 : USART_IRQ_Handler 功能描述 : 串口中断函数,所有串口均用此函数,接收完成后,向注册的任务发送消息. 输入参数 : void 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ void USART_IRQ_Handler(void) { #if 1//_USE_RVL_ uint32 i = 0; S_UART_RX_CTRL *puart = &uart_ctrl[0]; MSG *pmsg; os_int_enter(); for(i=0;ivalid) { continue; } //串口未使能 if(0==(COM_USART[i]->CR1&USART_CR1_UE)) { continue; } //if(SET!=USART_GetFlagStatus(COM_USART[i], USART_FLAG_RXNE)) if(SET!=__HAL_USART_GET_FLAG(&husart[i], USART_FLAG_RXNE)) continue; //USART_ClearFlag(COM_USART[i],USART_FLAG_RXNE); __HAL_UART_CLEAR_FLAG(&husart[i], USART_FLAG_RXNE); puart->buffer[puart->buf_cnt][puart->index++]= USART_ReceiveData(COM_USART[i]); if(puart->index>UART_RCV_BUF_LEN-32) { if(puart->task_id) { pmsg = &puart->msg[puart->buf_cnt]; pmsg->type = MSG_RS232; pmsg->need_free = MSG_NO_NEED_FREE; pmsg->wPara = puart->index; pmsg->rPara = i; pmsg->lPara = (uint32)&puart->buffer[puart->buf_cnt]; send_msg(puart->task_id, pmsg); } puart->buf_cnt++; puart->buf_cnt&=(UART_REC_BUF_BAK-1); puart->index = 0; } } os_int_exit(); #endif } /***************************************************************************** 函 数 名 : uart_timer_check 功能描述 : 串口缓冲区周期检查函数,有tick中断调用. 两帧命令最小间隔为20ms!! 2个tick 输入参数 : void 使用tick检查,效率太低,需要额外定义一个快速的定时器,间隔1ms左右,bps为115200,20ms检查过长 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年6月3日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ static __IO uint32 uart_timer_num = 0; uint32 get_uart_timer_num(void) { return uart_timer_num; } static void uart_timer_check(void) { static uint8 checkcnt[UART_PORT_NUM]={0,}; static uint16 len[UART_PORT_NUM]={0,}; uint32 i = 0; S_UART_RX_CTRL *puart = &uart_ctrl[0]; MSG *pmsg; uart_timer_num++; for(i=0;ivalid) continue; if(!puart->index) continue; if(len[i]==puart->index) { checkcnt[i]++; if(checkcnt[i]>=5) //5ms { if(puart->task_id) { pmsg = &puart->msg[puart->buf_cnt]; pmsg->type = MSG_RS232; pmsg->need_free = MSG_NO_NEED_FREE; pmsg->wPara = puart->index; pmsg->rPara = i; pmsg->lPara = (uint32)&puart->buffer[puart->buf_cnt]; send_msg(puart->task_id, pmsg); } puart->buf_cnt++; puart->buf_cnt&=(UART_REC_BUF_BAK-1); puart->index = 0; checkcnt[i] = 0; len[i] = 0; } } else { len[i] = puart->index; checkcnt[i] = 0; } } } /******************************I2C部分配置函数***************************************/ #if I2C_SOFT_GPIO==0 static uint32 i2c_init_bsp(uint32 i2c_num) { I2C_HandleTypeDef hi2c; #if 1//_USE_RVL_ I2C_InitTypeDef I2C_InitStructure; static I2C_TypeDef* i2c_base[] = {I2C1,I2C2,I2C3}; if(i2c_num>2) return ERR_I2C_NUM_ERR; hi2c.Instance = i2c_base[i2c_num]; /* I2C configuration */ /*I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_NORMAL_SPEED;*/ HAL_I2C_DeInit(i2c_base[i2c_num]); hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c.Init.OwnAddress1 = 0x00; hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c.Init.ClockSpeed = I2C_NORMAL_SPEED; hi2c.Init.GeneralCallMode = I2C_GENERALCALL_ENABLE; hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; //hi2c.Mode = HAL_I2C_MODE_MASTER; HAL_I2C_Init(i2c_base[i2c_num], &I2C_InitStructure); __HAL_I2C_ENABLE(&hi2c);//I2C_Cmd(i2c_base[i2c_num],ENABLE); #endif return ERR_NO_ERR; } #endif //i2c初始化,要分别配置时钟,GPIO口,最后在配置IO口I2C模式. //I2C 序号为0,1,2 /* 硬件上,现在使用了两个I2C口 序号 原理图名称 芯片端口 SCL SDA 0 I2C1 PB8,PB9 连接外部接口板,扩充使用(ts接口板等) 1 I2C2 PF1,PF0 连接FPGA 2 I2C3 PA8,PC9 连接E2 3 I2C4(只能模拟) pe3,pe4 连接tuner 4 I2C5 PD0,PD1 连接dryloop, */ uint32 i2c_com_init(uint32 i2c_num) { #if 1//_USE_RVL_ #if I2C_SOFT_GPIO static const uint32 i2c_scl_pin[I2C_MAX_NUM] = {GPIO_Pin_8,GPIO_Pin_1,GPIO_Pin_8,GPIO_Pin_3,GPIO_Pin_0}; static GPIO_TypeDef* i2c_scl_pin_port[I2C_MAX_NUM] = {GPIOB,GPIOF,GPIOA,GPIOE,GPIOD}; static const uint32 i2c_scl_gpio_clk[I2C_MAX_NUM] = {RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOF,RCC_AHB1Periph_GPIOA,RCC_AHB1Periph_GPIOE,RCC_AHB1Periph_GPIOD}; static const uint32 i2c_sda_pin[I2C_MAX_NUM] = {GPIO_Pin_9,GPIO_Pin_0,GPIO_Pin_9,GPIO_Pin_4,GPIO_Pin_1}; static GPIO_TypeDef* i2c_sda_pin_port[I2C_MAX_NUM] = {GPIOB,GPIOF,GPIOC,GPIOE,GPIOD}; static const uint32 i2c_sda_gpio_clk[I2C_MAX_NUM] = {RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOF,RCC_AHB1Periph_GPIOC,RCC_AHB1Periph_GPIOE,RCC_AHB1Periph_GPIOD}; GPIO_InitTypeDef GPIO_InitStructure; if(i2c_num>=I2C_MAX_NUM) { return ERR_I2C_NUM_ERR; } #if 1//_USE_RVL_ i2c_mutex[i2c_num] = create_mutex(); #endif RCC_AHB1PeriphClockCmd(i2c_scl_gpio_clk[i2c_num] | i2c_sda_gpio_clk[i2c_num],ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); GPIO_InitStructure.Pin = i2c_scl_pin[i2c_num]; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Pull = GPIO_NOPULL; HAL_GPIO_Init(i2c_scl_pin_port[i2c_num], &GPIO_InitStructure); GPIO_InitStructure.Pin = i2c_sda_pin[i2c_num]; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Pull = GPIO_NOPULL; HAL_GPIO_Init(i2c_sda_pin_port[i2c_num], &GPIO_InitStructure); i2c_gpio[i2c_num].scl_port = i2c_scl_pin_port[i2c_num]; i2c_gpio[i2c_num].sda_port = i2c_sda_pin_port[i2c_num]; i2c_gpio[i2c_num].scl_pin = i2c_scl_pin[i2c_num]; i2c_gpio[i2c_num].sda_pin = i2c_sda_pin[i2c_num]; GPIO_SetBits(i2c_scl_pin_port[i2c_num],i2c_scl_pin[i2c_num]); GPIO_SetBits(i2c_sda_pin_port[i2c_num],i2c_sda_pin[i2c_num]); //空闲状态,都拉高 return 0; #else static const uint32 i2c_clk[3] = {RCC_APB1Periph_I2C1,RCC_APB1Periph_I2C2,RCC_APB1Periph_I2C3}; static const uint32 i2c_scl_pin[3] = {GPIO_Pin_8,GPIO_Pin_1,GPIO_Pin_8}; static GPIO_TypeDef* i2c_scl_pin_port[3] = {GPIOB,GPIOF,GPIOA}; static const uint32 i2c_scl_pin_source[3] = {GPIO_PinSource8,GPIO_PinSource1,GPIO_PinSource8}; static const uint32 i2c_scl_gpio_clk[3] = {RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOF,RCC_AHB1Periph_GPIOA}; static const uint32 i2c_sda_pin[3] = {GPIO_Pin_9,GPIO_Pin_0,GPIO_Pin_9}; static GPIO_TypeDef* i2c_sda_pin_port[3] = {GPIOB,GPIOF,GPIOC}; static const uint32 i2c_sda_pin_source[3] = {GPIO_PinSource9,GPIO_PinSource0,GPIO_PinSource9}; static const uint32 i2c_sda_gpio_clk[3] = {RCC_AHB1Periph_GPIOB,RCC_AHB1Periph_GPIOF,RCC_AHB1Periph_GPIOC}; static const uint32 i2c_af[3] = {GPIO_AF4_I2C1,GPIO_AF4_I2C2,GPIO_AF4_I2C3}; GPIO_InitTypeDef GPIO_InitStructure; #error "STM32F407 i2c must in gpio soft mode!" if(i2c_num>I2C_MAX_NUM) { return ERR_I2C_NUM_ERR; } i2c_mutex[i2c_num] = create_mutex(); RCC_APB1PeriphClockCmd(i2c_clk[i2c_num], ENABLE); RCC_AHB1PeriphClockCmd(i2c_scl_gpio_clk[i2c_num] | i2c_sda_gpio_clk[i2c_num],ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); RCC_APB1PeriphResetCmd(i2c_clk[i2c_num], ENABLE); RCC_APB1PeriphResetCmd(i2c_clk[i2c_num], DISABLE); GPIO_PinAFConfig(i2c_scl_pin_port[i2c_num], i2c_scl_pin_source[i2c_num], i2c_af[i2c_num]); GPIO_PinAFConfig(i2c_sda_pin_port[i2c_num], i2c_sda_pin_source[i2c_num], i2c_af[i2c_num]); /*GPIO_InitStructure.GPIO_Pin = i2c_scl_pin[i2c_num]; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;*/ GPIO_InitStructure.Pin = i2c_scl_pin[i2c_num]; GPIO_InitStructure.Mode = GPIO_MODE_AF_OD; GPIO_InitStructure.Speed = GPIO_Speed_2MHz; GPIO_InitStructure.Pull = GPIO_NOPULL; HAL_GPIO_Init(i2c_scl_pin_port[i2c_num], &GPIO_InitStructure); GPIO_InitStructure.Pin = i2c_sda_pin[i2c_num]; HAL_GPIO_Init(i2c_sda_pin_port[i2c_num], &GPIO_InitStructure); return i2c_init_bsp(i2c_num); #endif #endif } void TIM5_IRQ_Handler(void) { os_int_enter(); __HAL_TIM_CLEAR_IT(&htim5,TIM_IT_UPDATE);//TIM_ClearFlag(TIM5,TIM_IT_Update); #if 1//_USE_RVL_ uart_timer_check(); #endif os_int_exit(); } /*初始化系统LED灯用到的gpio口, LED PE1 配置为输出口,低电平亮 */ void sys_led_gpio_init(void) { GPIO_InitTypeDef gpio_init_struct; gpio_init_struct.Pin = GPIO_Pin_1; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Speed = GPIO_Speed_2MHz; gpio_init_struct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &gpio_init_struct); } /*初始化系统按键用到的gpio口,配置为输入口,拉高 low --> key press */ void sys_key_gpio_init(void) { #if 1//_USE_RVL_ GPIO_InitTypeDef gpio_init_struct; /*gpio_init_struct.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; gpio_init_struct.GPIO_Mode = GPIO_Mode_IN; gpio_init_struct.GPIO_OType = GPIO_OType_PP; gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz; gpio_init_struct.GPIO_PuPd = GPIO_PuPd_UP;*/ gpio_init_struct.Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; gpio_init_struct.Mode = GPIO_MODE_INPUT; gpio_init_struct.Speed = GPIO_Speed_2MHz; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOF, &gpio_init_struct); /*gpio_init_struct.GPIO_Pin = GPIO_Pin_0; gpio_init_struct.GPIO_Mode = GPIO_Mode_IN; gpio_init_struct.GPIO_OType = GPIO_OType_PP; gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz; gpio_init_struct.GPIO_PuPd = GPIO_PuPd_UP;*/ gpio_init_struct.Pin = GPIO_Pin_0; gpio_init_struct.Mode = GPIO_MODE_INPUT; gpio_init_struct.Speed = GPIO_Speed_2MHz; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOG, &gpio_init_struct); #endif//_USE_RVL_ } /*初始化系统LCD用到的gpio口,配置为输入口,拉高 配置的灯有 管脚 LCD_E PG3 CTL PG2 RS PG4 RW PG5 D0~D7 PE7~PE14 */ void sys_lcd_gpio_init(void) { #if 1//_USE_RVL_ GPIO_InitTypeDef gpio_init_struct; /*gpio_init_struct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3 |GPIO_Pin_4|GPIO_Pin_5; gpio_init_struct.GPIO_Mode = GPIO_Mode_OUT; gpio_init_struct.GPIO_OType = GPIO_OType_PP; gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz; gpio_init_struct.GPIO_PuPd = GPIO_PuPd_UP;*/ gpio_init_struct.Pin = GPIO_Pin_2|GPIO_Pin_3 |GPIO_Pin_4|GPIO_Pin_5; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Speed = GPIO_Speed_50MHz; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOG, &gpio_init_struct); /*gpio_init_struct.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14; gpio_init_struct.GPIO_Mode = GPIO_Mode_OUT; gpio_init_struct.GPIO_OType = GPIO_OType_PP; gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz; gpio_init_struct.GPIO_PuPd = GPIO_PuPd_UP;*/ gpio_init_struct.Pin = GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Speed = GPIO_Speed_50MHz; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &gpio_init_struct); #endif//_USE_RVL_ } void tuner_gpio_init(void) { #if 1//_USE_RVL_ GPIO_InitTypeDef gpio_init_struct; /*gpio_init_struct.GPIO_Pin = GPIO_Pin_1; gpio_init_struct.GPIO_Mode = GPIO_Mode_OUT; gpio_init_struct.GPIO_OType = GPIO_OType_PP; gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz; gpio_init_struct.GPIO_PuPd = GPIO_PuPd_UP;*/ gpio_init_struct.Pin = GPIO_Pin_1; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Speed = GPIO_Speed_50MHz; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOG, &gpio_init_struct); #endif//_USE_RVL_ } //控制运行灯,有主任务秒消息驱动 void run_led_ctl(void) { //GPIO_ToggleBits(GPIOE,GPIO_Pin_1); HAL_GPIO_TogglePin(GPIOE,GPIO_Pin_1); } //static int u32Val=0; #define USER_SET_UPDATE_ADDRESS (RTC_BKP_DR19) #define USER_UPDATE_FLAG (0X3366CC77) //要和boot一致 void SoftwareUpdateBegin(void) { #if 0//ETH_UPGRADE RTC_WriteBackupRegister(USER_SET_UPDATE_ADDRESS,USER_UPDATE_FLAG); RTC_ReadBackupRegister(USER_SET_UPDATE_ADDRESS); NVIC_SystemReset(); #endif } //初始化与FLASH连接的SPI口,主要用于FPGA存储曲线 //4.3 //名称 cs clk miso mosi //管脚 pa4 pa5 pa6 pb5 void spi_flash_com_init(void) { #if 1//_USE_RVL_ #if USE_SPI_FLASH GPIO_InitTypeDef GPIO_InitStructure; //SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); //GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1); /*GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);*/ /*GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);*/ /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;*/ GPIO_InitStructure.Pin = GPIO_Pin_5|GPIO_Pin_6; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Pull = GPIO_PULLDOWN; GPIO_InitStructure.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_Pin_5; GPIO_InitStructure.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;*/ GPIO_InitStructure.Pin = GPIO_Pin_4; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4); //CS默认为高 /*SPI_I2S_DeInit(FLASH_SPI); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //APB2 84M/4 21M SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Cmd(FLASH_SPI,DISABLE); SPI_Init(FLASH_SPI, &SPI_InitStructure);*/ /*SPI_CalculateCRC(FLASH_SPI,DISABLE); //禁用CRC功能 SPI_SSOutputCmd(FLASH_SPI,ENABLE); SPI_Cmd(FLASH_SPI,ENABLE);*/ hspi1.Instance = FLASH_SPI; HAL_SPI_DeInit(&hspi1); hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //与原先6911平台保持一致 hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; //APB1 42M/256 160k左右 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.CRCPolynomial = 7; __HAL_SPI_DISABLE(&hspi1); hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; HAL_SPI_Init(&hspi1); __HAL_SPI_ENABLE(&hspi1); #endif #endif//_USE_RVL_ } //初始化与FPGA连接的SPI口,主要用于升级FPGA代码 //名称 cs clk miso mosi //管脚 pb12 pb13 pb14 pb15 void spi_fpga_com_init(void) { #if 1//_USE_RVL_ GPIO_InitTypeDef GPIO_InitStructure; //SPI_InitTypeDef SPI_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF5_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF5_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF5_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF5_SPI2); GPIO_InitStructure.Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Pull = GPIO_PULLDOWN; GPIO_InitStructure.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_Pin_12; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Speed = GPIO_Speed_50MHz; GPIO_InitStructure.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_12); //CS默认为高 //SPI_I2S_DeInit(FPGA_SPI); hspi2.Instance = FPGA_SPI; HAL_SPI_DeInit(&hspi2); hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; //与原先6911平台保持一致 hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //APB1 42M/256 160k左右 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.CRCPolynomial = 7; /*SPI_Cmd(FPGA_SPI,DISABLE); SPI_Init(FPGA_SPI, &SPI_InitStructure); SPI_CalculateCRC(FPGA_SPI,DISABLE); //禁用CRC功能 SPI_SSOutputCmd(FPGA_SPI,ENABLE); SPI_Cmd(FPGA_SPI,ENABLE);*/ __HAL_SPI_DISABLE(&hspi2); hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; HAL_SPI_Init(&hspi2); __HAL_SPI_ENABLE(&hspi2); #endif//_USE_RVL_ } void spi_fpga_send_buf(uint8 *puc,uint32 length) { #if 1//_USE_RVL_ //portENTER_CRITICAL(); GPIO_ResetBits(GPIOB, GPIO_Pin_12); while(length--) { //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); SPI_I2S_SendData(FPGA_SPI, *puc++); //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_RXNE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_RXNE) == RESET); (void)SPI_I2S_ReceiveData(FPGA_SPI); } //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); delay_us(5); GPIO_SetBits(GPIOB, GPIO_Pin_12); //portEXIT_CRITICAL(); #endif } void spect_spi_read(uint32 len,void *pdata,uint32 restart) { #if 1//_USE_RVL_ uint8 *pchar = (uint8*)pdata; if((len==0)||(pdata==0)) return; GPIO_ResetBits(GPIOB, GPIO_Pin_12); if(restart==1) { //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); SPI_I2S_SendData(FPGA_SPI, 0xA5); //若需要重新读取数据,发送a5 //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_RXNE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_RXNE) == RESET); (void)SPI_I2S_ReceiveData(FPGA_SPI); } while(len--) { //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); SPI_I2S_SendData(FPGA_SPI, 0xFF); //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_RXNE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_RXNE) == RESET); *pchar++ = SPI_I2S_ReceiveData(FPGA_SPI); } //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); delay_us(5); GPIO_SetBits(GPIOB, GPIO_Pin_12); #endif } void tuner_config_power_on(void) {//低电平复位tuner, #if 0//@TMP_UNUSED_TUNER GPIO_ResetBits(GPIOG, GPIO_Pin_1); delay_ticks(5); GPIO_SetBits(GPIOG, GPIO_Pin_1); #endif } void tuner_config_power_reset(void) { #if 0//@TMP_UNUSED_TUNER GPIO_ResetBits(GPIOG, GPIO_Pin_1); delay_ticks(300); GPIO_SetBits(GPIOG, GPIO_Pin_1); #endif } void set_exc_reset(void) { NVIC_SystemReset(); } #define USE_STD_LIB 1 #if USE_STD_LIB #define HAL_STD_GPIO 1 #if HAL_STD_GPIO void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx->BSRR = GPIO_Pin; } void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx->BSRR = GPIO_Pin << 16; } uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) { return ((uint16_t)GPIOx->IDR); } #define CR_PLS_MASK PWR_CR_PLS void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) { uint32_t tmpreg = 0; /* Check the parameters */ assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); tmpreg = PWR->CR; /* Clear PLS[7:5] bits */ tmpreg &= CR_PLS_MASK; /* Set PLS[7:5] bits according to PWR_PVDLevel value */ tmpreg |= PWR_PVDLevel; /* Store the new value */ PWR->CR = tmpreg; } #endif void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB1ENR |= RCC_AHB1Periph; } else { RCC->AHB1ENR &= ~RCC_AHB1Periph; } } void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB2ENR |= RCC_AHB2Periph; } else { RCC->AHB2ENR &= ~RCC_AHB2Periph; } } void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB3_PERIPH(RCC_AHB3Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB3ENR |= RCC_AHB3Periph; } else { RCC->AHB3ENR &= ~RCC_AHB3Periph; } } void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->APB2ENR |= RCC_APB2Periph; } else { RCC->APB2ENR &= ~RCC_APB2Periph; } } void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->APB1ENR |= RCC_APB1Periph; } else { RCC->APB1ENR &= ~RCC_APB1Periph; } } void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB1RSTR |= RCC_AHB1Periph; } else { RCC->AHB1RSTR &= ~RCC_AHB1Periph; } } void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB2RSTR |= RCC_AHB2Periph; } else { RCC->AHB2RSTR &= ~RCC_AHB2Periph; } } void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB3_PERIPH(RCC_AHB3Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB3RSTR |= RCC_AHB3Periph; } else { RCC->AHB3RSTR &= ~RCC_AHB3Periph; } } void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->APB1RSTR |= RCC_APB1Periph; } else { RCC->APB1RSTR &= ~RCC_APB1Periph; } } void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->APB2RSTR |= RCC_APB2Periph; } else { RCC->APB2RSTR &= ~RCC_APB2Periph; } } void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { uint32_t temp = 0x00; uint32_t temp_2 = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); assert_param(IS_GPIO_AF(GPIO_AF)); temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp; GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; } void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); //assert_param(IS_USART_DATA(Data)); /* Transmit Data */ USARTx->DR = (Data & (uint16_t)0x01FF); } uint16_t USART_ReceiveData(USART_TypeDef* USARTx) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); /* Receive Data */ return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); } uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) { /* Check the parameters */ assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); /* Return the data in the DR register */ return SPIx->DR; } void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) { /* Check the parameters */ assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); /* Write in the DR register the data to be sent */ SPIx->DR = Data; } void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) { __IO uint32_t tmp = 0; /* Check the parameters */ assert_param(IS_RTC_BKP(RTC_BKP_DR)); tmp = RTC_BASE + 0x50; tmp += (RTC_BKP_DR * 4); /* Write the specified register */ *(__IO uint32_t *)tmp = (uint32_t)Data; } uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) { __IO uint32_t tmp = 0; /* Check the parameters */ assert_param(IS_RTC_BKP(RTC_BKP_DR)); tmp = RTC_BASE + 0x50; tmp += (RTC_BKP_DR * 4); /* Read the specified register */ return (*(__IO uint32_t *)tmp); } #endif