FreeModbus For stm32:點擊下載源碼
1、測試環境Keil MDK 4.7a stm32f103c8, PB12為輸出線圈,
可以通過Modbus Poll來控制線圈的輸出狀態。
2、通過ModbusProt.h配置硬件、數據緩沖區大小和功能碼配置
#define UART_USE 2 //串口號
#define TIM_USE 3 //定時器號
#define CPU_CLK 8 //8MHz
#define REG_INPUT_START 0x0000 //輸入寄存器起始地址
#define REG_INPUT_NREGS 6 //輸入寄存器數量
#define REG_HOLDING_START 0x0000 //保持寄存器起始地址
#define REG_HOLDING_NREGS 6 //保持寄存器數量
#define REG_COILS_START 0x0000 //線圈起始地址
#define REG_COILS_SIZE 8 //線圈數量(小於0x07B0)
#define REG_DISCRETE_START 0x0000 //離散開關起始地址
#define REG_DISCRETE_SIZE 8 //離散開關數量(小於0x07D0)
#define MB_FUNC_HANDLERS_MAX ( 4 ) //使用的功能碼數量
#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 4 )
#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( 0 ) //報告從設備功能
#define MB_FUNC_READ_INPUT_ENABLED ( 0 ) //讀輸入寄存器功能
#define MB_FUNC_READ_HOLDING_ENABLED ( 1 ) //讀保持寄存器功能
#define MB_FUNC_WRITE_HOLDING_ENABLED ( 0 ) //寫操持寄存存功能
#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) //寫多個操持寄存存功能
#define MB_FUNC_READ_COILS_ENABLED ( 0 ) //讀線圈
#define MB_FUNC_WRITE_COIL_ENABLED ( 1 ) //寫線圈
#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED ( 0 ) //寫多個線圈
#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED ( 0 ) //讀離散輸入
#define MB_FUNC_READWRITE_HOLDING_ENABLED ( 0 ) //讀寫多個寄存器
3、移植要點為Port.c和Port.h
定時器操作在stm32平台下基本不用改
a、定時器初始化; xMBPortTimersInit()
b、開定時器及中斷; vMBPortTimersEnable()
c、關定時器及中斷; vMBPortTimersDisable()
d、定時器溢出中斷服務程序;TIME_IQR_HANDLER()
串口操作:
a、串初始化; xMBPortSerialInit()
b、串口發送中斷、接收中斷; UART_IQR_HANDLER()
c、串口收發控制; vMBPortSerialEnable()
開關量操作 CPU硬件寄存器類型指針定義,用於定義IO輸入和輸出,
注意在此定義的IO必須初始化為輸入或輸出。
typedef volatile uint32_t * CPURegistertype;
//線圈狀態, 存儲格式:&IO輸出口寄存器, 引腳號
MBCoilType MBCoils[REG_COILS_SIZE] = {
&(GPIOB->ODR), 12, //PB12做為輸出線圈
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
};
//離散開關輸入狀態, 存儲格式:&IO輸出口寄存器, 引腳號
MBDiscreteType MBDiscretes[REG_DISCRETE_SIZE] = {
&(GPIOB->ODR), 12, //PB12做為離散輸入
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
&(GPIOB->ODR), 12,
};
Mail: worldsing@foxmail.com
QQ: 237539049