- typedef const struct
- {
- GPIO_Module *port;
- uint32_t mode;
- uint32_t pull;
- uint32_t rate;
- uint32_t current;
- uint32_t alt;
- uint32_t val_init;
- uint32_t pin;
- } gpio_init_cfg_type;
- static gpio_init_cfg_type gpio_cfg[] = {
- {GPIOA, GPIO_MODE_AF_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF5_USART1, 1, GPIO_PIN_9},
- {GPIOA, GPIO_MODE_AF_PP, GPIO_PULL_UP, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF5_USART1, 1, GPIO_PIN_10},
-
- {GPIOB, GPIO_MODE_AF_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF10_UART3, 1, GPIO_PIN_10},
- {GPIOB, GPIO_MODE_AF_PP, GPIO_PULL_UP, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF10_UART3, 1, GPIO_PIN_11},
-
- {GPIOB, GPIO_MODE_AF_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF7_UART4, 1, GPIO_PIN_0},
- {GPIOB, GPIO_MODE_AF_PP, GPIO_PULL_UP, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, GPIO_AF7_UART4, 1, GPIO_PIN_1},
-
- {GPIOA, GPIO_MODE_OUT_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, 0, 1, GPIO_PIN_15},
- {GPIOB, GPIO_MODE_OUT_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, 0, 1, GPIO_PIN_3},
- {GPIOB, GPIO_MODE_OUT_PP, GPIO_NO_PULL, GPIO_SLEW_RATE_FAST, GPIO_DS_8MA, 0, 1, GPIO_PIN_4},
- };
- void bsp_gpio_init(void)
- {
- int index;
- // clock enable
- RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
-
- RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
- RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOB);
- RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOC);
- RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD);
-
-
- for(int index = 0;index < sizeof(gpio_cfg)/sizeof(gpio_cfg[0]);index++)
- {
- GPIO_InitType GPIO_InitStructure;
- GPIO_Structure_Initialize(&GPIO_InitStructure);
-
- GPIO_InitStructure.Pin = gpio_cfg[index].pin;
- GPIO_InitStructure.GPIO_Mode = gpio_cfg[index].mode;
- GPIO_InitStructure.GPIO_Current = gpio_cfg[index].current;
-
- GPIO_InitStructure.GPIO_Alternate = gpio_cfg[index].alt;
-
- GPIO_InitStructure.GPIO_Slew_Rate = gpio_cfg[index].rate;
-
- GPIO_InitStructure.GPIO_Pull = gpio_cfg[index].pull;
- GPIO_Peripheral_Initialize(gpio_cfg[index].port, &GPIO_InitStructure);
-
- if(GPIO_InitStructure.GPIO_Mode == GPIO_MODE_OUT_PP || GPIO_InitStructure.GPIO_Mode == GPIO_MODE_OUT_OD)
- {
- if(gpio_cfg[index].val_init)
- GPIO_Pins_Set(gpio_cfg[index].port, gpio_cfg[index].pin);
- else
- GPIO_Pins_Reset(gpio_cfg[index].port, gpio_cfg[index].pin);
- }
- }
- }
本示例配置UART1,UART3,UART4的管脚,UART1作为调试打印端口,UART和UART4分别做MODBUS主机和从机。
modbus用现成的协议栈,只需要修改端口及定时器管理即可。端口部分主要是初始化和中断处理,定时器在1ms系统定时器中计数处理。
modbus串口初始化
isr服务程序
- void mbISR()
- {
- volatile uint32_t IntSt;
- volatile uint8_t Data;
- mbObj.timeout_cnt = 0;
- IntSt = mbPORT->STS;
- if (IntSt & USART_STS_RXDNE)
- {
- Data = UART_RCV_DAT();
- if ((IntSt & UART_RX_ERR_FLAG) != 0)
- {
- if (mbObj.rcv_cnt >= 1)
- {
- mbObj.err_st.bits.hal = 1;
- }
- }
- mb_data_rcv(&mbObj, Data);
- }
- else if ((mbObj.snd_size <= mbObj.snd_cnt) && (IntSt & USART_STS_TXC))
- {
- mb_send_end(&mbObj);
- mb_tx1_rx0_enable(0);
- UART_TX_TC_CLR();
- }
- else if (IntSt & USART_STS_TXDE)
- {
- if (mb_data_send(&mbObj, mb_byte_send, 1))
- {
- UART_TX_TC_EN();
- }
- }
- else
- {
- }
- }
下面附上测试工程,欢迎讨论。
本测试将开发板PB0连接PB11,PB1连接PB10,可令modbus主机和从机进行通信。
===========================================================================
内部资源分配:
===========================================================================
UART1: 调试信息打印
UART3: MODBUS 主机 PB10, PB11
UART4: MODBUS 从机 PB0, PB1
===========================================================================
demo-n32g430.rar
(2.26 MB, 下载次数: 30)
另外顺便调了一下串口打印,上电按按键结果如下:
@安小芯