| @@ -64,7 +64,7 @@ | |||||
| /* #define HAL_MMC_MODULE_ENABLED */ | /* #define HAL_MMC_MODULE_ENABLED */ | ||||
| /* #define HAL_SPI_MODULE_ENABLED */ | /* #define HAL_SPI_MODULE_ENABLED */ | ||||
| /* #define HAL_TIM_MODULE_ENABLED */ | /* #define HAL_TIM_MODULE_ENABLED */ | ||||
| /* #define HAL_UART_MODULE_ENABLED */ | |||||
| #define HAL_UART_MODULE_ENABLED | |||||
| /* #define HAL_USART_MODULE_ENABLED */ | /* #define HAL_USART_MODULE_ENABLED */ | ||||
| /* #define HAL_IRDA_MODULE_ENABLED */ | /* #define HAL_IRDA_MODULE_ENABLED */ | ||||
| /* #define HAL_SMARTCARD_MODULE_ENABLED */ | /* #define HAL_SMARTCARD_MODULE_ENABLED */ | ||||
| @@ -55,6 +55,7 @@ void SVC_Handler(void); | |||||
| void DebugMon_Handler(void); | void DebugMon_Handler(void); | ||||
| void PendSV_Handler(void); | void PendSV_Handler(void); | ||||
| void SysTick_Handler(void); | void SysTick_Handler(void); | ||||
| void USART1_IRQHandler(void); | |||||
| void OTG_FS_IRQHandler(void); | void OTG_FS_IRQHandler(void); | ||||
| /* USER CODE BEGIN EFP */ | /* USER CODE BEGIN EFP */ | ||||
| @@ -41,6 +41,7 @@ | |||||
| /* USER CODE END PM */ | /* USER CODE END PM */ | ||||
| /* Private variables ---------------------------------------------------------*/ | /* Private variables ---------------------------------------------------------*/ | ||||
| UART_HandleTypeDef huart1; | |||||
| /* USER CODE BEGIN PV */ | /* USER CODE BEGIN PV */ | ||||
| @@ -49,6 +50,7 @@ | |||||
| /* Private function prototypes -----------------------------------------------*/ | /* Private function prototypes -----------------------------------------------*/ | ||||
| void SystemClock_Config(void); | void SystemClock_Config(void); | ||||
| static void MX_GPIO_Init(void); | static void MX_GPIO_Init(void); | ||||
| static void MX_USART1_UART_Init(void); | |||||
| /* USER CODE BEGIN PFP */ | /* USER CODE BEGIN PFP */ | ||||
| /* USER CODE END PFP */ | /* USER CODE END PFP */ | ||||
| @@ -88,6 +90,7 @@ int main(void) | |||||
| /* Initialize all configured peripherals */ | /* Initialize all configured peripherals */ | ||||
| MX_GPIO_Init(); | MX_GPIO_Init(); | ||||
| MX_USB_DEVICE_Init(); | MX_USB_DEVICE_Init(); | ||||
| MX_USART1_UART_Init(); | |||||
| /* USER CODE BEGIN 2 */ | /* USER CODE BEGIN 2 */ | ||||
| /* USER CODE END 2 */ | /* USER CODE END 2 */ | ||||
| @@ -97,7 +100,7 @@ int main(void) | |||||
| while (1) | while (1) | ||||
| { | { | ||||
| /* USER CODE END WHILE */ | /* USER CODE END WHILE */ | ||||
| /* USER CODE BEGIN 3 */ | /* USER CODE BEGIN 3 */ | ||||
| } | } | ||||
| /* USER CODE END 3 */ | /* USER CODE END 3 */ | ||||
| @@ -152,6 +155,39 @@ void SystemClock_Config(void) | |||||
| HAL_RCC_EnableCSS(); | HAL_RCC_EnableCSS(); | ||||
| } | } | ||||
| /** | |||||
| * @brief USART1 Initialization Function | |||||
| * @param None | |||||
| * @retval None | |||||
| */ | |||||
| static void MX_USART1_UART_Init(void) | |||||
| { | |||||
| /* USER CODE BEGIN USART1_Init 0 */ | |||||
| /* USER CODE END USART1_Init 0 */ | |||||
| /* USER CODE BEGIN USART1_Init 1 */ | |||||
| /* USER CODE END USART1_Init 1 */ | |||||
| huart1.Instance = USART1; | |||||
| huart1.Init.BaudRate = 115200; | |||||
| huart1.Init.WordLength = UART_WORDLENGTH_8B; | |||||
| huart1.Init.StopBits = UART_STOPBITS_1; | |||||
| huart1.Init.Parity = UART_PARITY_EVEN; | |||||
| huart1.Init.Mode = UART_MODE_TX_RX; | |||||
| huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | |||||
| huart1.Init.OverSampling = UART_OVERSAMPLING_16; | |||||
| if (HAL_UART_Init(&huart1) != HAL_OK) | |||||
| { | |||||
| Error_Handler(); | |||||
| } | |||||
| /* USER CODE BEGIN USART1_Init 2 */ | |||||
| /* USER CODE END USART1_Init 2 */ | |||||
| } | |||||
| /** | /** | ||||
| * @brief GPIO Initialization Function | * @brief GPIO Initialization Function | ||||
| * @param None | * @param None | ||||
| @@ -76,6 +76,77 @@ void HAL_MspInit(void) | |||||
| /* USER CODE END MspInit 1 */ | /* USER CODE END MspInit 1 */ | ||||
| } | } | ||||
| /** | |||||
| * @brief UART MSP Initialization | |||||
| * This function configures the hardware resources used in this example | |||||
| * @param huart: UART handle pointer | |||||
| * @retval None | |||||
| */ | |||||
| void HAL_UART_MspInit(UART_HandleTypeDef* huart) | |||||
| { | |||||
| GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
| if(huart->Instance==USART1) | |||||
| { | |||||
| /* USER CODE BEGIN USART1_MspInit 0 */ | |||||
| /* USER CODE END USART1_MspInit 0 */ | |||||
| /* Peripheral clock enable */ | |||||
| __HAL_RCC_USART1_CLK_ENABLE(); | |||||
| __HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
| /**USART1 GPIO Configuration | |||||
| PA9 ------> USART1_TX | |||||
| PA10 ------> USART1_RX | |||||
| */ | |||||
| GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; | |||||
| GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |||||
| GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
| GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | |||||
| GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | |||||
| HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
| /* USART1 interrupt Init */ | |||||
| HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); | |||||
| HAL_NVIC_EnableIRQ(USART1_IRQn); | |||||
| /* USER CODE BEGIN USART1_MspInit 1 */ | |||||
| /* USER CODE END USART1_MspInit 1 */ | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief UART MSP De-Initialization | |||||
| * This function freeze the hardware resources used in this example | |||||
| * @param huart: UART handle pointer | |||||
| * @retval None | |||||
| */ | |||||
| void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) | |||||
| { | |||||
| if(huart->Instance==USART1) | |||||
| { | |||||
| /* USER CODE BEGIN USART1_MspDeInit 0 */ | |||||
| /* USER CODE END USART1_MspDeInit 0 */ | |||||
| /* Peripheral clock disable */ | |||||
| __HAL_RCC_USART1_CLK_DISABLE(); | |||||
| /**USART1 GPIO Configuration | |||||
| PA9 ------> USART1_TX | |||||
| PA10 ------> USART1_RX | |||||
| */ | |||||
| HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); | |||||
| /* USART1 interrupt DeInit */ | |||||
| HAL_NVIC_DisableIRQ(USART1_IRQn); | |||||
| /* USER CODE BEGIN USART1_MspDeInit 1 */ | |||||
| /* USER CODE END USART1_MspDeInit 1 */ | |||||
| } | |||||
| } | |||||
| /* USER CODE BEGIN 1 */ | /* USER CODE BEGIN 1 */ | ||||
| /* USER CODE END 1 */ | /* USER CODE END 1 */ | ||||
| @@ -56,6 +56,7 @@ | |||||
| /* External variables --------------------------------------------------------*/ | /* External variables --------------------------------------------------------*/ | ||||
| extern PCD_HandleTypeDef hpcd_USB_OTG_FS; | extern PCD_HandleTypeDef hpcd_USB_OTG_FS; | ||||
| extern UART_HandleTypeDef huart1; | |||||
| /* USER CODE BEGIN EV */ | /* USER CODE BEGIN EV */ | ||||
| /* USER CODE END EV */ | /* USER CODE END EV */ | ||||
| @@ -199,6 +200,20 @@ void SysTick_Handler(void) | |||||
| /* please refer to the startup file (startup_stm32f4xx.s). */ | /* please refer to the startup file (startup_stm32f4xx.s). */ | ||||
| /******************************************************************************/ | /******************************************************************************/ | ||||
| /** | |||||
| * @brief This function handles USART1 global interrupt. | |||||
| */ | |||||
| void USART1_IRQHandler(void) | |||||
| { | |||||
| /* USER CODE BEGIN USART1_IRQn 0 */ | |||||
| /* USER CODE END USART1_IRQn 0 */ | |||||
| HAL_UART_IRQHandler(&huart1); | |||||
| /* USER CODE BEGIN USART1_IRQn 1 */ | |||||
| /* USER CODE END USART1_IRQn 1 */ | |||||
| } | |||||
| /** | /** | ||||
| * @brief This function handles USB On The Go FS global interrupt. | * @brief This function handles USB On The Go FS global interrupt. | ||||
| */ | */ | ||||
| @@ -0,0 +1,158 @@ | |||||
| # Modbus通信 | |||||
| ## 任务要求 | |||||
| - 了解Modbus的基本概念 | |||||
| - 熟悉功能码0x01、0x03、0x0f、0x10 | |||||
| - 书写规格书 | |||||
| · 使用word文档书写 | |||||
| - 书写方案书 | |||||
| · 使用Visio绘制流程图 | |||||
| · 使用word文档书写 | |||||
| - 书写测试大纲 | |||||
| · 书写测试大纲以保证自身产品的正确性、稳定性 | |||||
| · 使用word文档书写 | |||||
| - 实现ModbusRTU主站(触摸屏) | |||||
| · 能够正常连接 | |||||
| · 能够判断连接断开 | |||||
| · 能够按要求生成请求帧 | |||||
| · 能够正确解析应答帧,并做相应处理 | |||||
| · 能够进行超时处理 | |||||
| · 拥有美观易操作的人机界面 | |||||
| - 实现ModbusRTU从站(PLC) | |||||
| · 能够正常连接 | |||||
| · 能够判断连接断开 | |||||
| · 能够正确解析请求帧 | |||||
| · 对于正确请求帧给出正确应答帧 | |||||
| · 对于错误请求帧给出错误应答帧或按规格给出相应的处理 | |||||
| 附加功能: | |||||
| - 如果需要读取0x10000位置的寄存器该如何处理? | |||||
| - 如果需要读取所有单数个寄存器,如何提高读取效率? | |||||
| - 如果需要获取通信历史该如何处理? | |||||
| - 如果从机数据需要断电不丢失该怎么处理? | |||||
| - 提高人机交互的美观性及易用性。 | |||||
| 注: | |||||
| - 该任务需要基于ucos移植实现 | |||||
| - Modbus学习需要书写相关学习笔记 | |||||
| - 线圈和寄存器范围都是0~0x270F | |||||
| - 要求方案书有明确的层级结构 | |||||
| - 最终实现代码需要与方案书相一致 | |||||
| - 代码书写需按照给定的代码规范完成 | |||||
| - 对于解析部分需要做对应的单元测试 | |||||
| - 代码管理空间为:``http://gitea.xinje.cc/TrainCamp_姓名全拼_Modbus.git`` | |||||
| - 目录结构如下图所示: | |||||
| TrainCamp_姓名全拼_modbus | |||||
| |---iar | |||||
| | |---settings | |||||
| | |---XXX.dep | |||||
| | |---XXX.ewd | |||||
| | |---XXX.ewp | |||||
| | |---XXX.eww | |||||
| | |---XXX.icf | |||||
| | +---startup_stm32xxx.s | |||||
| |---app | |||||
| | |---main.h | |||||
| | +---main.c | |||||
| |---cmsis | |||||
| | |---core_cm3.h | |||||
| | | . | |||||
| | | . | |||||
| | | . | |||||
| | +---tz_context.h | |||||
| |---drivers | |||||
| | |---inc | |||||
| | | +---stm32f103_gpio.h | |||||
| | +---src | |||||
| | +---stm32f103_gpio.h | |||||
| |---modbus | |||||
| +---.gitignore | |||||
| ## 任务器材 | |||||
| | 器材 | 数量 | | |||||
| | ---------- | --------- | | |||||
| | XDM-60T4-E/XDM-60T10-E | 1台 | | |||||
| | ST-LINK | 1个 | | |||||
| | 电源线 | 1根 | | |||||
| | USB-COM | 1个 | | |||||
| | XVP线 | 2根 | | |||||
| | TG765-MT | 1台 | | |||||
| ## XDM-60T4-E硬件信息 | |||||
| - 芯片型号: STM32F407IG ,晶振12MHz。 | |||||
| - 引脚信息 | |||||
| | 芯片引脚 | 实际作用 | | |||||
| | --------- | -------- | | |||||
| | I0 | PH10 | | |||||
| | I1 | PH11 | | |||||
| | I2 | PG8 | | |||||
| | I3 | PB4 | | |||||
| | I4 | PB5 | | |||||
| | I5 | PG12 | | |||||
| | I6 | PB6 | | |||||
| | I7 | PB7 | | |||||
| | I10 | PF10 | | |||||
| | I11 | PA15 | | |||||
| | I12 | PB3 | | |||||
| | I13 | PA14 | | |||||
| | I14 | PI4 | | |||||
| | I15 | PI5 | | |||||
| | I16 | PI6 | | |||||
| | I17 | PI7 | | |||||
| | I20 | PE2 | | |||||
| | Q0 | PF6 | | |||||
| | Q1 | PF8 | | |||||
| | Q2 | PF7 | | |||||
| | Q3 | PF9 | | |||||
| | Q4 | PI8 | | |||||
| | Q5 | PE6 | | |||||
| | Q6 | PE5 | | |||||
| | Q7 | PE4 | | |||||
| | Q10 | PG7 | | |||||
| | Q11 | PG6 | | |||||
| | Q12 | PH9 | | |||||
| | Q13 | PH8 | | |||||
| | Q14 | PH7 | | |||||
| | Q15 | PH6 | | |||||
| | Q16 | PF11 | | |||||
| | Q17 | PB0 | | |||||
| | Q20 | PH5 | | |||||
| | USART1_TX | PA9 | | |||||
| | USART1_RX | PA10 | | |||||
| ## XDM-60T10-E硬件信息 | |||||
| - 芯片型号:STM32F407ZG,晶振12MHz。 | |||||
| - 引脚信息 | |||||
| | 芯片引脚 | 实际作用 | | |||||
| | --------- | -------- | | |||||
| | I0 | PA0 | | |||||
| | I1 | PA1 | | |||||
| | I2 | PG8 | | |||||
| | I3 | PB4 | | |||||
| | I4 | PB5 | | |||||
| | I5 | PG12 | | |||||
| | I6 | PB6 | | |||||
| | I7 | PB7 | | |||||
| | I10 | PF10 | | |||||
| | I11 | PA15 | | |||||
| | I12 | PB3 | | |||||
| | I13 | PA14 | | |||||
| | Q0 | PF6 | | |||||
| | Q1 | PF8 | | |||||
| | Q2 | PF7 | | |||||
| | Q3 | PF9 | | |||||
| | USART1_TX | PA9 | | |||||
| | USART1_RX | PA10 | | |||||
| @@ -0,0 +1,27 @@ | |||||
| # Modbus相关知识点 | |||||
| ## 基本概念 | |||||
| - Modbus基本概念 | |||||
| - 应用场景 | |||||
| - 三种通信模式 | |||||
| - 广播模式与单播模式 | |||||
| - 事务处理流程 | |||||
| - 寄存器相关概念 | |||||
| ## 数据帧格式 | |||||
| - 0x01功能码 | |||||
| · 请求帧格式 | |||||
| · 应答帧格式 | |||||
| - 0x03功能码 | |||||
| · 请求帧格式 | |||||
| · 应答帧格式 | |||||
| - 0x0f功能码 | |||||
| · 请求帧格式 | |||||
| · 应答帧格式 | |||||
| - 0x10功能码 | |||||
| · 请求帧格式 | |||||
| · 应答帧格式 | |||||
| ## 嵌入式平台 | |||||
| - 串口通信 | |||||
| - 网口通信 | |||||
| - 人机界面 | |||||
| @@ -1148,6 +1148,9 @@ | |||||
| <file> | <file> | ||||
| <name>$PROJ_DIR$/../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c</name> | <name>$PROJ_DIR$/../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c</name> | ||||
| </file> | </file> | ||||
| <file> | |||||
| <name>$PROJ_DIR$/../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c</name> | |||||
| </file> | |||||
| </group> | </group> | ||||
| <group> | <group> | ||||
| <name>CMSIS</name> | <name>CMSIS</name> | ||||
| @@ -10,18 +10,21 @@ Mcu.Family=STM32F4 | |||||
| Mcu.IP0=NVIC | Mcu.IP0=NVIC | ||||
| Mcu.IP1=RCC | Mcu.IP1=RCC | ||||
| Mcu.IP2=SYS | Mcu.IP2=SYS | ||||
| Mcu.IP3=USB_DEVICE | |||||
| Mcu.IP4=USB_OTG_FS | |||||
| Mcu.IPNb=5 | |||||
| Mcu.IP3=USART1 | |||||
| Mcu.IP4=USB_DEVICE | |||||
| Mcu.IP5=USB_OTG_FS | |||||
| Mcu.IPNb=6 | |||||
| Mcu.Name=STM32F407I(E-G)Tx | Mcu.Name=STM32F407I(E-G)Tx | ||||
| Mcu.Package=LQFP176 | Mcu.Package=LQFP176 | ||||
| Mcu.Pin0=PH0-OSC_IN | Mcu.Pin0=PH0-OSC_IN | ||||
| Mcu.Pin1=PH1-OSC_OUT | Mcu.Pin1=PH1-OSC_OUT | ||||
| Mcu.Pin2=PA11 | |||||
| Mcu.Pin3=PA12 | |||||
| Mcu.Pin4=VP_SYS_VS_Systick | |||||
| Mcu.Pin5=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS | |||||
| Mcu.PinsNb=6 | |||||
| Mcu.Pin2=PA9 | |||||
| Mcu.Pin3=PA10 | |||||
| Mcu.Pin4=PA11 | |||||
| Mcu.Pin5=PA12 | |||||
| Mcu.Pin6=VP_SYS_VS_Systick | |||||
| Mcu.Pin7=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS | |||||
| Mcu.PinsNb=8 | |||||
| Mcu.ThirdPartyNb=0 | Mcu.ThirdPartyNb=0 | ||||
| Mcu.UserConstants= | Mcu.UserConstants= | ||||
| Mcu.UserName=STM32F407IGTx | Mcu.UserName=STM32F407IGTx | ||||
| @@ -38,11 +41,16 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||||
| NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | ||||
| NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | ||||
| NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | ||||
| NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | |||||
| NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | ||||
| PA10.Mode=Asynchronous | |||||
| PA10.Signal=USART1_RX | |||||
| PA11.Mode=Device_Only | PA11.Mode=Device_Only | ||||
| PA11.Signal=USB_OTG_FS_DM | PA11.Signal=USB_OTG_FS_DM | ||||
| PA12.Mode=Device_Only | PA12.Mode=Device_Only | ||||
| PA12.Signal=USB_OTG_FS_DP | PA12.Signal=USB_OTG_FS_DP | ||||
| PA9.Mode=Asynchronous | |||||
| PA9.Signal=USART1_TX | |||||
| PCC.Checker=false | PCC.Checker=false | ||||
| PCC.Display=Plot\: All Steps | PCC.Display=Plot\: All Steps | ||||
| PCC.Line=STM32F407/417 | PCC.Line=STM32F407/417 | ||||
| @@ -88,7 +96,7 @@ ProjectManager.ToolChainLocation= | |||||
| ProjectManager.UAScriptAfterPath= | ProjectManager.UAScriptAfterPath= | ||||
| ProjectManager.UAScriptBeforePath= | ProjectManager.UAScriptBeforePath= | ||||
| ProjectManager.UnderRoot=false | ProjectManager.UnderRoot=false | ||||
| ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false | |||||
| ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,4-MX_USART1_UART_Init-USART1-false-HAL-true | |||||
| RCC.48MHZClocksFreq_Value=48000000 | RCC.48MHZClocksFreq_Value=48000000 | ||||
| RCC.AHBFreq_Value=168000000 | RCC.AHBFreq_Value=168000000 | ||||
| RCC.APB1CLKDivider=RCC_HCLK_DIV4 | RCC.APB1CLKDivider=RCC_HCLK_DIV4 | ||||
| @@ -123,6 +131,9 @@ RCC.VCOI2SOutputFreq_Value=192000000 | |||||
| RCC.VCOInputFreq_Value=1000000 | RCC.VCOInputFreq_Value=1000000 | ||||
| RCC.VCOOutputFreq_Value=336000000 | RCC.VCOOutputFreq_Value=336000000 | ||||
| RCC.VcooutputI2S=96000000 | RCC.VcooutputI2S=96000000 | ||||
| USART1.IPParameters=VirtualMode,Parity | |||||
| USART1.Parity=PARITY_EVEN | |||||
| USART1.VirtualMode=VM_ASYNC | |||||
| USB_DEVICE.CLASS_NAME_FS=CDC | USB_DEVICE.CLASS_NAME_FS=CDC | ||||
| USB_DEVICE.IPParameters=VirtualMode-CDC_FS,VirtualModeFS,CLASS_NAME_FS | USB_DEVICE.IPParameters=VirtualMode-CDC_FS,VirtualModeFS,CLASS_NAME_FS | ||||
| USB_DEVICE.VirtualMode-CDC_FS=Cdc | USB_DEVICE.VirtualMode-CDC_FS=Cdc | ||||