init:初始框架
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_adc
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
|
||||
#include "zf_driver_adc.h"
|
||||
|
||||
static ADC12_Regs *adc_list[2] = {ADC0, ADC1}; // 模块索引数组
|
||||
static uint8 adc_resolution[2] = {ADC_12BIT, ADC_12BIT}; // 精度数据备份
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 adc 转换数据
|
||||
// 参数说明 adc_pin 选择 adc 通道 (详见 zf_driver_adc.h 中枚举 adc_pin_enum 定义)
|
||||
// 返回参数 uint16 转换的 adc 值
|
||||
// 使用示例 adc_convert(ADC1_CH0_A0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 adc_convert (adc_pin_enum adc_pin)
|
||||
{
|
||||
uint8 adc_index = (adc_pin >> ADC_INDEX_OFFSET) & ADC_INDEX_MASK;
|
||||
uint8 adc_channel = (adc_pin >> ADC_CHANNEL_OFFSET) & ADC_CHANNEL_MASK;
|
||||
uint16 return_value = 0;
|
||||
|
||||
DL_ADC12_disableConversions(adc_list[adc_index]);
|
||||
DL_ADC12_configConversionMem
|
||||
(
|
||||
adc_list[adc_index], DL_ADC12_MEM_IDX_0,
|
||||
adc_channel, DL_ADC12_REFERENCE_VOLTAGE_VDDA,
|
||||
DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
|
||||
DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT,
|
||||
DL_ADC12_WINDOWS_COMP_MODE_DISABLED
|
||||
);
|
||||
DL_ADC12_enableConversions(adc_list[adc_index]);
|
||||
|
||||
DL_ADC12_startConversion(adc_list[adc_index]);
|
||||
while(!(adc_list[adc_index]->ULLMEM.CPU_INT.RIS & ADC12_CPU_INT_RIS_MEMRESIFG0_SET));
|
||||
DL_ADC12_stopConversion(adc_list[adc_index]);
|
||||
return_value = DL_ADC12_getMemResult(adc_list[adc_index], DL_ADC12_MEM_IDX_0);
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 adc 均值滤波转换
|
||||
// 参数说明 adc_pin 选择 adc 通道 (详见 zf_driver_adc.h 中枚举 adc_pin_enum 定义)
|
||||
// 参数说明 count 均值滤波次数
|
||||
// 返回参数 uint16 转换的 adc 值
|
||||
// 使用示例 adc_mean_filter_convert(ADC1_CH0_A0, 5); // 采集5次 然后返回平均值
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 adc_mean_filter_convert (adc_pin_enum adc_pin, const uint8 count)
|
||||
{
|
||||
uint8 i = 0;
|
||||
uint32 sum = 0;
|
||||
|
||||
for(i = 0; i < count; i ++)
|
||||
{
|
||||
sum += adc_convert(adc_pin);
|
||||
}
|
||||
|
||||
return sum / count;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 adc 初始化
|
||||
// 参数说明 adc_pin 选择 adc 通道 (详见 zf_driver_adc.h 中枚举 adc_pin_enum 定义)
|
||||
// 参数说明 resolution 选择选择通道分辨率(如果同一个 adc 模块初始化时设置了不同的分辨率 则最后一个初始化的分辨率生效)
|
||||
// 返回参数 void
|
||||
// 使用示例 adc_init(ADC1_CH0_A0, ADC_8BIT); // 初始化 A0 为 ADC1 的 channel0 输入功能 分辨率为8位
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void adc_init (adc_pin_enum adc_pin, adc_resolution_enum resolution)
|
||||
{
|
||||
static const DL_ADC12_ClockConfig adc_clock_config =
|
||||
{
|
||||
.clockSel = DL_ADC12_CLOCK_HFCLK,
|
||||
.divideRatio = DL_ADC12_CLOCK_DIVIDE_1,
|
||||
.freqRange = DL_ADC12_CLOCK_FREQ_RANGE_32_TO_40,
|
||||
};
|
||||
|
||||
uint8 adc_index = (adc_pin >> ADC_INDEX_OFFSET) & ADC_INDEX_MASK;
|
||||
uint8 adc_channel = (adc_pin >> ADC_CHANNEL_OFFSET) & ADC_CHANNEL_MASK;
|
||||
|
||||
gpio_init((gpio_pin_enum)(adc_pin >> ADC_PIN_INDEX_OFFSET) & ADC_PIN_INDEX_MASK, GPI, GPIO_LOW, GPI_ANAOG_IN);
|
||||
|
||||
DL_ADC12_disableConversions(adc_list[adc_index]);
|
||||
DL_ADC12_setClockConfig(adc_list[adc_index], (DL_ADC12_ClockConfig *)&adc_clock_config);
|
||||
|
||||
DL_ADC12_setStartAddress(adc_list[adc_index], DL_ADC12_SEQ_START_ADDR_00);
|
||||
DL_ADC12_configConversionMem
|
||||
(
|
||||
adc_list[adc_index], DL_ADC12_MEM_IDX_0,
|
||||
adc_channel, DL_ADC12_REFERENCE_VOLTAGE_VDDA,
|
||||
DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
|
||||
DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT,
|
||||
DL_ADC12_WINDOWS_COMP_MODE_DISABLED
|
||||
);
|
||||
adc_list[adc_index]->ULLMEM.CTL2 &= ~ADC12_CTL2_RES_MASK;
|
||||
adc_list[adc_index]->ULLMEM.CTL2 |= (resolution << ADC12_CTL2_RES_OFS);
|
||||
adc_list[adc_index]->ULLMEM.CTL0 |= ADC12_CTL0_PWRDN_MANUAL;
|
||||
DL_ADC12_enableConversions(adc_list[adc_index]);
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_adc
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_adc_h_
|
||||
#define _zf_driver_adc_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
#define ADC_NUM ( 2 )
|
||||
|
||||
typedef enum // 枚举 ADC 模块 此枚举定义不允许用户修改
|
||||
{
|
||||
ADC_0,
|
||||
ADC_1,
|
||||
}adc_index_enum;
|
||||
|
||||
typedef enum // 枚举 ADC 通道 此枚举定义不允许用户修改
|
||||
{
|
||||
ADC_CHANNEL_0,
|
||||
ADC_CHANNEL_1,
|
||||
ADC_CHANNEL_2,
|
||||
ADC_CHANNEL_3,
|
||||
ADC_CHANNEL_4,
|
||||
ADC_CHANNEL_5,
|
||||
ADC_CHANNEL_6,
|
||||
ADC_CHANNEL_7,
|
||||
}adc_channel_enum;
|
||||
|
||||
// 定义引脚要用的宏定义 根据各单片机不同 可以自由定义需要什么信息
|
||||
// bit[11:0 ] 固定为引脚索引
|
||||
// bit[15:12] 固定为引脚复用
|
||||
// bit[19:16] 在 UART 模块中为 UART 索引
|
||||
|
||||
#define ADC_PIN_INDEX_OFFSET ( 0 ) // bit[11:0 ] 存储 GPIO 的索引号
|
||||
#define ADC_PIN_INDEX_MASK ( 0x0FFF ) // 宽度 12bit 因此掩码为 0x0FFF
|
||||
|
||||
#define ADC_CHANNEL_OFFSET ( 12 ) // bit[15:12] 存储 ADC 通道索引
|
||||
#define ADC_CHANNEL_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
#define ADC_INDEX_OFFSET ( 16 ) // bit[19:16] 存储 ADC 索引
|
||||
#define ADC_INDEX_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
typedef enum // 枚举 ADC 引脚通道 此枚举定义不允许用户修改
|
||||
{
|
||||
ADC0_CH0_A27 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_0 << ADC_CHANNEL_OFFSET) | (A27)),
|
||||
ADC0_CH1_A26 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_1 << ADC_CHANNEL_OFFSET) | (A26)),
|
||||
ADC0_CH2_A25 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_2 << ADC_CHANNEL_OFFSET) | (A25)),
|
||||
ADC0_CH3_A24 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_3 << ADC_CHANNEL_OFFSET) | (A24)),
|
||||
ADC0_CH4_B25 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_4 << ADC_CHANNEL_OFFSET) | (B25)),
|
||||
ADC0_CH5_B24 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_5 << ADC_CHANNEL_OFFSET) | (B24)),
|
||||
ADC0_CH6_B20 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_6 << ADC_CHANNEL_OFFSET) | (B20)),
|
||||
ADC0_CH7_A22 = ((ADC_0 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_7 << ADC_CHANNEL_OFFSET) | (A22)),
|
||||
|
||||
ADC1_CH0_A15 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_0 << ADC_CHANNEL_OFFSET) | (A15)),
|
||||
ADC1_CH1_A16 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_1 << ADC_CHANNEL_OFFSET) | (A16)),
|
||||
ADC1_CH2_A17 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_2 << ADC_CHANNEL_OFFSET) | (A17)),
|
||||
ADC1_CH3_A18 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_3 << ADC_CHANNEL_OFFSET) | (A18)),
|
||||
ADC1_CH4_B17 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_4 << ADC_CHANNEL_OFFSET) | (B17)),
|
||||
ADC1_CH5_B18 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_5 << ADC_CHANNEL_OFFSET) | (B18)),
|
||||
ADC1_CH6_B19 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_6 << ADC_CHANNEL_OFFSET) | (B19)),
|
||||
ADC1_CH7_A21 = ((ADC_1 << ADC_INDEX_OFFSET) | (ADC_CHANNEL_7 << ADC_CHANNEL_OFFSET) | (A21)),
|
||||
}adc_pin_enum;
|
||||
|
||||
typedef enum // 枚举 ADC 分辨率 此枚举定义不允许用户修改
|
||||
{
|
||||
ADC_12BIT , // 12 位分辨率
|
||||
ADC_10BIT , // 10 位分辨率
|
||||
ADC_8BIT , // 8 位分辨率
|
||||
}adc_resolution_enum;
|
||||
|
||||
uint16 adc_convert (adc_pin_enum adc_pin);
|
||||
uint16 adc_mean_filter_convert (adc_pin_enum adc_pin, const uint8 count);
|
||||
void adc_init (adc_pin_enum adc_pin, adc_resolution_enum resolution);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,83 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_delay
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_driver_delay.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 延时函数 ms 级别
|
||||
// 参数说明 time 需要延时的时间 ms 级别
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_ms(100);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_ms (uint32 time)
|
||||
{
|
||||
SysTick->LOAD = CPUCLK_FREQ / 1000;
|
||||
SysTick->VAL = 0UL;
|
||||
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
|
||||
|
||||
while(time --)
|
||||
{
|
||||
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 延时函数 us 级别
|
||||
// 参数说明 time 需要延时的时间 us 级别
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_us(100);
|
||||
// 备注信息 受限于程序运行跳转 此延时会比输入值高出一些
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_us (uint32 time)
|
||||
{
|
||||
SysTick->LOAD = CPUCLK_FREQ / 1000000 * time;
|
||||
SysTick->VAL = 0UL;
|
||||
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
|
||||
|
||||
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system delay 初始化
|
||||
// 参数说明 void
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_init();
|
||||
// 备注信息 本函数由 clock_init 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_init (void)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_delay
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_delay_h_
|
||||
#define _zf_driver_delay_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
void system_delay_ms (uint32 time);
|
||||
void system_delay_us (uint32 time);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,146 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_exti
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_common_interrupt.h"
|
||||
|
||||
#include "zf_driver_exti.h"
|
||||
|
||||
static void exti_callbakc_defalut (uint32 event, void *ptr);
|
||||
void_callback_uint32_ptr exti_callback_list[GPIO_GROUP_PIN_NUMBER_MAX] =
|
||||
{
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut,
|
||||
exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut, exti_callbakc_defalut
|
||||
};
|
||||
void *exti_callback_ptr_list[GPIO_GROUP_PIN_NUMBER_MAX] =
|
||||
{
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断默认回调函数
|
||||
// 参数说明 event 触发中断的事件 此处默认为 0
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void exti_callbakc_defalut (uint32 event, void *ptr)
|
||||
{
|
||||
(void)event;
|
||||
(void)ptr;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断使能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_enable(pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_enable (gpio_pin_enum pin)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
gpio_group[io_group]->CPU_INT.IMASK |= (0x00000001 << io_pin);
|
||||
interrupt_enable(GPIOA_INT_IRQn);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断失能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_disable(pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_disable (gpio_pin_enum pin)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
gpio_group[io_group]->CPU_INT.IMASK &= ~(0x00000001 << io_pin);
|
||||
|
||||
if(!gpio_group[io_group]->CPU_INT.IMASK)
|
||||
{
|
||||
interrupt_disable(GPIOA_INT_IRQn);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断初始化
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 trigger 选择触发的信号方式 [EXTI_TRIGGER_RISING/EXTI_TRIGGER_FALLING/EXTI_TRIGGER_BOTH]
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_init(pin, trigger, callback, ptrs);
|
||||
// 备注信息 以 Line 为准 例如初始化了 A0 就不能初始化 B0 否则就会导致两个 IO 的中断冲突
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_init (gpio_pin_enum pin, exti_trigger_enum trigger, void_callback_uint32_ptr callback, void *ptr)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
uint32 register_temp = 0;
|
||||
|
||||
gpio_init(pin, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化选中的引脚
|
||||
|
||||
exti_callback_ptr_list[io_pin] = ptr;
|
||||
exti_callback_list[io_pin] = (NULL == callback) ? (exti_callbakc_defalut) : (callback);
|
||||
|
||||
if(15 >= io_pin)
|
||||
{
|
||||
register_temp = gpio_group[io_group]->POLARITY15_0;
|
||||
register_temp &= ~(0x00000003 << ((io_pin % 16) * 2));
|
||||
register_temp |= ((uint32)trigger << ((io_pin % 16) * 2));
|
||||
gpio_group[io_group]->POLARITY15_0 = register_temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
register_temp = gpio_group[io_group]->POLARITY31_16;
|
||||
register_temp &= ~(0x00000003 << ((io_pin % 16) * 2));
|
||||
register_temp |= ((uint32)trigger << ((io_pin % 16) * 2));
|
||||
gpio_group[io_group]->POLARITY31_16 = register_temp;
|
||||
}
|
||||
gpio_group[io_group]->CPU_INT.ICLR |= (0x00000001 << io_pin);
|
||||
gpio_group[io_group]->CPU_INT.IMASK |= (0x00000001 << io_pin);
|
||||
|
||||
interrupt_enable(GPIOA_INT_IRQn);
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_exti
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_exti_h_
|
||||
#define _zf_driver_exti_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
typedef enum{ // 枚举 EXTI 触发信号 此枚举定义不允许用户修改
|
||||
EXTI_TRIGGER_RISING = 1 , // 上升沿触发模式
|
||||
EXTI_TRIGGER_FALLING , // 下降沿触发模式
|
||||
EXTI_TRIGGER_BOTH , // 双边沿触发模式
|
||||
}exti_trigger_enum;
|
||||
|
||||
extern void_callback_uint32_ptr exti_callback_list[GPIO_GROUP_PIN_NUMBER_MAX];
|
||||
extern void *exti_callback_ptr_list[GPIO_GROUP_PIN_NUMBER_MAX];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断使能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_enable(pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_enable (gpio_pin_enum pin);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断失能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_disable(pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_disable (gpio_pin_enum pin);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断初始化
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 trigger 选择触发的信号方式 [EXTI_TRIGGER_RISING/EXTI_TRIGGER_FALLING/EXTI_TRIGGER_BOTH]
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_init(pin, trigger, callback, ptrs);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_init (gpio_pin_enum pin, exti_trigger_enum trigger, void_callback_uint32_ptr callback, void *ptr);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,309 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_flash
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_common_interrupt.h"
|
||||
|
||||
#include "zf_driver_flash.h"
|
||||
|
||||
flash_data_union flash_union_buffer[FLASH_DATA_BUFFER_SIZE]; // FLASHCTL 操作的数据缓冲区
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 校验 FLASHCTL 是否有数据
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0>
|
||||
// 返回参数 uint8 1-有数据 0-没有数据 如果需要对有数据的区域写入新的数据则应该对所在扇区进行擦除操作
|
||||
// 使用示例 flash_check(0, 0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_check (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
uint8 return_state = 0;
|
||||
uint16 temp_loop = 0;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
|
||||
for(temp_loop = 0; FLASH_PAGE_SIZE > temp_loop; temp_loop += 8) // 循环读取 Flash 的值
|
||||
{
|
||||
if(0xffffffff != (*(__IO uint32*) (flash_addr + temp_loop))) // 如果不是 0xffffffff 那就是有值
|
||||
{
|
||||
return_state = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 擦除扇区
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0>
|
||||
// 返回参数 uint8 1-表示失败 0-表示成功
|
||||
// 使用示例 flash_erase_page(0, 0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_erase_page (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
volatile uint32 time_out = FLASH_OPERATION_TIME_OUT;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
|
||||
uint32 primask = interrupt_global_disable();
|
||||
|
||||
DL_FlashCTL_unprotectSector(
|
||||
FLASHCTL, flash_addr, DL_FLASHCTL_REGION_SELECT_MAIN);
|
||||
|
||||
|
||||
FLASHCTL->GEN.CMDTYPE =
|
||||
DL_FLASHCTL_COMMAND_SIZE_SECTOR | DL_FLASHCTL_COMMAND_TYPE_ERASE;
|
||||
|
||||
FLASHCTL->GEN.CMDADDR = flash_addr;
|
||||
|
||||
FLASHCTL->GEN.CMDEXEC = FLASHCTL_CMDEXEC_VAL_EXECUTE;
|
||||
|
||||
do
|
||||
{
|
||||
time_out--;
|
||||
}while((DL_FLASHCTL_COMMAND_STATUS_IN_PROGRESS == FLASHCTL->GEN.STATCMD) && (0x00 != time_out)); // 等待超时或者完成
|
||||
|
||||
|
||||
if(DL_FLASHCTL_COMMAND_STATUS_PASSED & FLASHCTL->GEN.STATCMD) // 如果不是操作完成 例如超时或出错
|
||||
{
|
||||
time_out = 0;
|
||||
}
|
||||
|
||||
DL_FlashCTL_executeClearStatus(FLASHCTL);
|
||||
interrupt_global_enable(primask);
|
||||
|
||||
return ((!time_out) ? 1 : 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 读取一页
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0>
|
||||
// 参数说明 buf 需要读取的数据地址 传入的数组类型必须为uint32
|
||||
// 参数说明 len 需要写入的数据长度 参数范围 1-256
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_read_page(0, 0, data_buffer, 256);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_read_page (uint32 sector_num, uint32 page_num, uint32 *buf, uint16 len)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
zf_assert(FLASH_DATA_BUFFER_SIZE >= len); // 参数范围 1-256
|
||||
zf_assert(NULL != buf);
|
||||
uint16 temp_loop = 0;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
|
||||
for(temp_loop = 0; temp_loop < len; temp_loop ++) // 根据指定长度读取
|
||||
{
|
||||
*buf ++ = *(__IO uint32*)(flash_addr + temp_loop * 8); // 循环读取 Flash 的值
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 编程一页
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <>
|
||||
// 参数说明 buf 需要写入的数据地址 传入的数组类型必须为 uint32
|
||||
// 参数说明 len 需要写入的数据长度 参数范围 1-256
|
||||
// 返回参数 uint8 1-表示失败 0-表示成功
|
||||
// 使用示例 flash_write_page(0, 0, data_buffer, 256);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_write_page (uint32 sector_num, uint32 page_num, const uint32 *buf, uint16 len)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
zf_assert(FLASH_DATA_BUFFER_SIZE >= len); // 参数范围 1-256
|
||||
zf_assert(NULL != buf);
|
||||
uint8 return_state = 0;
|
||||
volatile uint32 time_out = FLASH_OPERATION_TIME_OUT;
|
||||
uint32 *data_pointer = (uint32 *)buf;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
|
||||
if(flash_check(sector_num, page_num)) // 判断是否有数据 这里是冗余的保护 防止有人没擦除就写入
|
||||
{
|
||||
flash_erase_page(sector_num, page_num); // 擦除这一页
|
||||
}
|
||||
|
||||
uint32 primask = interrupt_global_disable();
|
||||
|
||||
|
||||
// len *= 2;
|
||||
while(len --) // 根据长度
|
||||
{
|
||||
|
||||
DL_FlashCTL_unprotectSector(
|
||||
FLASHCTL, (FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num), DL_FLASHCTL_REGION_SELECT_MAIN);
|
||||
FLASHCTL->GEN.CMDTYPE = (uint32_t) DL_FLASHCTL_COMMAND_SIZE_ONE_WORD |
|
||||
DL_FLASHCTL_COMMAND_TYPE_PROGRAM;
|
||||
|
||||
FLASHCTL->GEN.CMDBYTEN = DL_FLASHCTL_PROGRAM_32_WITH_ECC;
|
||||
|
||||
FLASHCTL->GEN.CMDADDR = flash_addr;
|
||||
|
||||
FLASHCTL->GEN.CMDDATA0 = (*data_pointer ++);
|
||||
|
||||
FLASHCTL->GEN.CMDEXEC = FLASHCTL_CMDEXEC_VAL_EXECUTE;
|
||||
|
||||
time_out = FLASH_OPERATION_TIME_OUT;
|
||||
do
|
||||
{
|
||||
time_out --;
|
||||
|
||||
}while((DL_FLASHCTL_COMMAND_STATUS_IN_PROGRESS == FLASHCTL->GEN.STATCMD) && (0x00 != time_out)); // 等待超时或者完成
|
||||
|
||||
|
||||
if((!(DL_FLASHCTL_COMMAND_STATUS_PASSED & FLASHCTL->GEN.STATCMD)) || (0 == time_out)) // 如果不是操作完成 例如超时或出错
|
||||
{
|
||||
return_state = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
DL_FlashCTL_executeClearStatus(FLASHCTL);
|
||||
|
||||
flash_addr += 8;
|
||||
}
|
||||
|
||||
|
||||
interrupt_global_enable(primask);
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 从指定 FLASHCTL 的扇区的指定页码读取数据到缓冲区
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 < 0 >
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_read_page_to_buffer(0, 0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_read_page_to_buffer (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
uint16 temp_loop = 0;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
|
||||
for(temp_loop = 0; FLASH_DATA_BUFFER_SIZE > temp_loop; temp_loop ++) // 根据指定长度读取
|
||||
{
|
||||
flash_union_buffer[temp_loop].uint32_type = *(__IO uint32*)(flash_addr + temp_loop * 8); // 循环读取 Flash 的值
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 向指定 FLASHCTL 的扇区的指定页码写入缓冲区的数据
|
||||
// 参数说明 sector_num 需要写入的扇区编号 参数范围 <0 - 3>
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0>
|
||||
// 返回参数 uint8 1-表示失败 0-表示成功
|
||||
// 使用示例 flash_write_page_from_buffer(0, 0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_write_page_from_buffer (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(FLASH_MAX_SECTION_INDEX > sector_num); // 参数范围 0-63
|
||||
zf_assert(FLASH_MAX_PAGE_INDEX > page_num); // 参数范围 0-3
|
||||
uint8 return_state = 0;
|
||||
volatile uint32 time_out = FLASH_OPERATION_TIME_OUT;
|
||||
uint32 flash_addr = ((FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num)); // 提取当前 Flash 地址
|
||||
uint32 *data_pointer1 = (uint32 *)flash_union_buffer;
|
||||
|
||||
uint16 data_len = FLASH_DATA_BUFFER_SIZE *2;
|
||||
|
||||
|
||||
if(flash_check(sector_num, page_num)) // 判断是否有数据 这里是冗余的保护 防止有人没擦除就写入
|
||||
{
|
||||
flash_erase_page(sector_num, page_num); // 擦除这一页
|
||||
}
|
||||
|
||||
uint32 primask = interrupt_global_disable();
|
||||
|
||||
|
||||
|
||||
while(data_len --) // 根据长度
|
||||
{
|
||||
|
||||
DL_FlashCTL_unprotectSector(
|
||||
FLASHCTL,(FLASH_BASE_ADDR + FLASH_SECTION_SIZE * sector_num + FLASH_PAGE_SIZE * page_num) , DL_FLASHCTL_REGION_SELECT_MAIN);
|
||||
|
||||
FLASHCTL->GEN.CMDTYPE = (uint32_t) DL_FLASHCTL_COMMAND_SIZE_ONE_WORD |
|
||||
DL_FLASHCTL_COMMAND_TYPE_PROGRAM;
|
||||
|
||||
FLASHCTL->GEN.CMDBYTEN = DL_FLASHCTL_PROGRAM_32_WITH_ECC;
|
||||
|
||||
FLASHCTL->GEN.CMDADDR = flash_addr;
|
||||
|
||||
FLASHCTL->GEN.CMDDATA0 = (*data_pointer1 ++);
|
||||
|
||||
FLASHCTL->GEN.CMDEXEC = FLASHCTL_CMDEXEC_VAL_EXECUTE;
|
||||
|
||||
time_out = FLASH_OPERATION_TIME_OUT;
|
||||
do
|
||||
{
|
||||
time_out --;
|
||||
}
|
||||
while((DL_FLASHCTL_COMMAND_STATUS_IN_PROGRESS == FLASHCTL->GEN.STATCMD) && (0x00 != time_out)); // 等待超时或者完成
|
||||
|
||||
if((!(DL_FLASHCTL_COMMAND_STATUS_PASSED & FLASHCTL->GEN.STATCMD)) || (0 == time_out)) // 如果不是操作完成 例如超时或出错
|
||||
{
|
||||
return_state = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
DL_FlashCTL_executeClearStatus(FLASHCTL);
|
||||
flash_addr += 8;
|
||||
|
||||
}
|
||||
|
||||
interrupt_global_enable(primask);
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 清空数据缓冲区
|
||||
// 参数说明 void
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_buffer_clear();
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_buffer_clear (void)
|
||||
{
|
||||
memset(flash_union_buffer, 0xFF, FLASH_PAGE_SIZE);
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_flash
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_flash_h_
|
||||
#define _zf_driver_flash_h_
|
||||
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
// 以下宏定义为芯片固定设置 不允许用户修改
|
||||
#define FLASH_BASE_ADDR ( 0x00016000 ) //0x00008000(前32k地址) 前32k可擦除10w次 后96k擦除1w次
|
||||
#define FLASH_MAX_PAGE_INDEX ( 2 )
|
||||
#define FLASH_MAX_SECTION_INDEX ( 6 )
|
||||
#define FLASH_PAGE_SIZE ( 0x00000400 ) // 1K byte
|
||||
#define FLASH_SECTION_SIZE ( FLASH_PAGE_SIZE * FLASH_MAX_PAGE_INDEX ) // 2K byte
|
||||
#define FLASH_OPERATION_TIME_OUT ( 0x0FFF )
|
||||
|
||||
#define FLASH_DATA_BUFFER_SIZE ( FLASH_PAGE_SIZE / sizeof(flash_data_union) )// 自动计算每个页能够存下多少个数据
|
||||
|
||||
typedef union // 固定的数据缓冲单元格式
|
||||
{
|
||||
float float_type; // float 类型
|
||||
uint32 uint32_type; // uint32 类型
|
||||
int32 int32_type; // int32 类型
|
||||
uint16 uint16_type; // uint16 类型
|
||||
int16 int16_type; // int16 类型
|
||||
uint8 uint8_type; // uint8 类型
|
||||
int8 int8_type; // int8 类型
|
||||
}flash_data_union; // 所有类型数据共用同一个 32bit 地址
|
||||
|
||||
extern flash_data_union flash_union_buffer[FLASH_DATA_BUFFER_SIZE];
|
||||
|
||||
uint8 flash_check (uint32 sector_num, uint32 page_num);
|
||||
uint8 flash_erase_page (uint32 sector_num, uint32 page_num);
|
||||
void flash_read_page (uint32 sector_num, uint32 page_num, uint32 *buf, uint16 len);
|
||||
uint8 flash_write_page (uint32 sector_num, uint32 page_num, const uint32 *buf, uint16 len);
|
||||
|
||||
void flash_read_page_to_buffer (uint32 sector_num, uint32 page_num);
|
||||
uint8 flash_write_page_from_buffer (uint32 sector_num, uint32 page_num);
|
||||
void flash_buffer_clear (void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,237 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_gpio
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
GPIO_Regs *gpio_group[GPIO_GROUP_MAX] = {GPIOA, GPIOB};
|
||||
|
||||
const uint8 gpio_iomux_index[60] =
|
||||
{
|
||||
// A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 ,
|
||||
1 - 1, 2 - 1, 7 - 1, 8 - 1, 9 - 1, 10 - 1, 11 - 1, 14 - 1,
|
||||
// A8 , A9 , A10, A11, A12, A13, A14, A15,
|
||||
19 - 1, 20 - 1, 21 - 1, 22 - 1, 34 - 1, 35 - 1, 36 - 1, 37 - 1,
|
||||
// A16, A17, A18, A19, A20, A21, A22, A23,
|
||||
38 - 1, 39 - 1, 40 - 1, 41 - 1, 42 - 1, 46 - 1, 47 - 1, 53 - 1,
|
||||
// A24, A25, A26, A27, A28, A29, A30, A31,
|
||||
54 - 1, 55 - 1, 59 - 1, 60 - 1, 3 - 1, 4 - 1, 5 - 1, 6 - 1,
|
||||
|
||||
// B0 , B1 , B2 , B3 , B4 , B5 , B6 , B7 ,
|
||||
12 - 1, 13 - 1, 15 - 1, 16 - 1, 17 - 1, 18 - 1, 23 - 1, 24 - 1,
|
||||
// B8 , B9 , B10, B11, B12, B13, B14, B15,
|
||||
25 - 1, 26 - 1, 27 - 1, 28 - 1, 29 - 1, 30 - 1, 31 - 1, 32 - 1,
|
||||
// B16, B17, B18, B19, B20, B21, B22, B23,
|
||||
33 - 1, 43 - 1, 44 - 1, 45 - 1, 48 - 1, 49 - 1, 50 - 1, 51 - 1,
|
||||
// B24, B25, B26, B27,
|
||||
52 - 1, 56 - 1, 57 - 1, 58 - 1,
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 输出设置
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dat 0:低电平 1:高电平
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_set_level(A14, 1); // A14 输出高电平
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_set_level (gpio_pin_enum pin, const uint8 dat)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
|
||||
( (dat) ?
|
||||
(gpio_group[io_group]->DOUTSET31_0 |= (0x00000001 << io_pin)) :
|
||||
(gpio_group[io_group]->DOUTCLR31_0 |= (0x00000001 << io_pin)));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 电平获取
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 uint8 引脚当前电平
|
||||
// 使用示例 uint8 status = gpio_get_level(A14); // 获取 A14 引脚电平
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 gpio_get_level (gpio_pin_enum pin)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
|
||||
return ((gpio_group[io_group]->DIN31_0 & (0x00000001 << io_pin)) ? (1) : (0));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 翻转电平
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_toggle_level(A14); // 翻转 A14 电平
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_toggle_level (gpio_pin_enum pin)
|
||||
{
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
|
||||
if((gpio_group[io_group]->DOUT31_0 & (0x00000001 << (pin & 0x1F))))
|
||||
{
|
||||
(gpio_group[io_group]->DOUTCLR31_0 |= (0x00000001 << io_pin));
|
||||
}
|
||||
else
|
||||
{
|
||||
(gpio_group[io_group]->DOUTSET31_0 |= (0x00000001 << io_pin));
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 方向设置
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dir 引脚的方向 输出:GPO 输入:GPI
|
||||
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_set_dir(A14, GPI, GPI_PULL_UP); // 设置 A14 为上拉输入
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum mode)
|
||||
{
|
||||
zf_assert(((GPO == dir) && (GPO == (dir & mode))) || ((GPI == dir) && (GPO != (dir & mode))));
|
||||
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
uint32 register_temp = (GPO_AF_PUSH_PULL == mode || GPO_AF_OPEN_DTAIN == mode)
|
||||
? (IOMUX->SECCFG.PINCM[gpio_iomux_index[io_group * 32 + io_pin]] & IOMUX_PINCM_PF_MASK)
|
||||
: 0;
|
||||
|
||||
register_temp |= (IOMUX_PINCM_PC_CONNECTED | IOMUX_PINCM_INENA_ENABLE);
|
||||
switch(mode)
|
||||
{
|
||||
case GPI_ANAOG_IN : register_temp = 0; break;
|
||||
case GPI_FLOATING_IN : register_temp |= 0; break;
|
||||
case GPI_PULL_DOWN : register_temp |= IOMUX_PINCM_PIPD_ENABLE; break;
|
||||
case GPI_PULL_UP : register_temp |= IOMUX_PINCM_PIPU_ENABLE; break;
|
||||
|
||||
case GPO_PUSH_PULL : register_temp |= 0; break;
|
||||
case GPO_OPEN_DTAIN : register_temp |= IOMUX_PINCM_HIZ1_ENABLE; break;
|
||||
case GPO_AF_PUSH_PULL : register_temp |= 0; break;
|
||||
case GPO_AF_OPEN_DTAIN : register_temp |= IOMUX_PINCM_HIZ1_ENABLE; break;
|
||||
}
|
||||
|
||||
IOMUX->SECCFG.PINCM[gpio_iomux_index[io_group * 32 + io_pin]] = register_temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 初始化
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dir 引脚的方向 [GPI/GPIO]
|
||||
// 参数说明 dat 引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平 仅在设置为输出模式时有效
|
||||
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_init(A14, GPI, GPIO_HIGH, GPI_PULL_UP);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, const uint8 dat, gpio_mode_enum mode)
|
||||
{
|
||||
zf_assert(((GPO == dir) && (GPO == (dir & mode))) || ((GPI == dir) && (GPO != (dir & mode))));
|
||||
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
uint32 register_temp = 0;
|
||||
|
||||
register_temp |= (IOMUX_PINCM_PC_CONNECTED | IOMUX_PINCM_INENA_ENABLE);
|
||||
switch(mode)
|
||||
{
|
||||
case GPI_ANAOG_IN : register_temp = 0; break;
|
||||
case GPI_FLOATING_IN : register_temp |= (0x00000001); break;
|
||||
case GPI_PULL_DOWN : register_temp |= (0x00000001 | IOMUX_PINCM_PIPD_ENABLE); break;
|
||||
case GPI_PULL_UP : register_temp |= (0x00000001 | IOMUX_PINCM_PIPU_ENABLE); break;
|
||||
|
||||
case GPO_PUSH_PULL : register_temp |= (0x00000001); break;
|
||||
case GPO_OPEN_DTAIN : register_temp |= (0x00000001 | IOMUX_PINCM_HIZ1_ENABLE); break;
|
||||
case GPO_AF_PUSH_PULL : register_temp |= 0; break;
|
||||
case GPO_AF_OPEN_DTAIN : register_temp |= IOMUX_PINCM_HIZ1_ENABLE; break;
|
||||
|
||||
}
|
||||
|
||||
IOMUX->SECCFG.PINCM[gpio_iomux_index[io_group * 32 + io_pin]] = register_temp;
|
||||
|
||||
if(GPO == dir)
|
||||
{
|
||||
gpio_group[io_group]->DOESET31_0 = (0x00000001 << io_pin);
|
||||
gpio_set_level(pin, dat); // 初始化电平设置
|
||||
}
|
||||
if(GPI_PULL_DOWN == mode)
|
||||
{
|
||||
gpio_set_level(pin, GPIO_LOW);
|
||||
}
|
||||
if(GPI_PULL_UP == mode)
|
||||
{
|
||||
gpio_set_level(pin, GPIO_HIGH);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 复用功能初始化 一般是内部调用
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dir 引脚的方向 [GPI/GPIO]
|
||||
// 参数说明 af 引脚的功能选择 (可选择范围由 zf_driver_gpio.h 内 gpio_af_enum 枚举值确定)
|
||||
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 afio_init(A14, GPO, GPIO_AF0, GPO_AF_PUSH_PULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void afio_init (gpio_pin_enum pin, gpio_dir_enum dir, gpio_af_enum af, gpio_mode_enum mode)
|
||||
{
|
||||
zf_assert(((GPO == dir) && (GPO == (dir & mode))) || ((GPI == dir) && (GPO != (dir & mode))));
|
||||
|
||||
uint8 io_group = ((pin >> GPIO_GROUP_INDEX_OFFSET) & GPIO_GROUP_INDEX_MASK);
|
||||
uint8 io_pin = ((pin >> GPIO_PIN_INDEX_OFFSET) & GPIO_PIN_INDEX_MASK);
|
||||
uint32 register_temp = af;
|
||||
|
||||
register_temp |= (IOMUX_PINCM_PC_CONNECTED | IOMUX_PINCM_INENA_ENABLE);
|
||||
switch(mode)
|
||||
{
|
||||
case GPI_ANAOG_IN : register_temp = 0; break;
|
||||
case GPI_FLOATING_IN : register_temp |= 0; break;
|
||||
case GPI_PULL_DOWN : register_temp |= IOMUX_PINCM_PIPD_ENABLE; break;
|
||||
case GPI_PULL_UP : register_temp |= IOMUX_PINCM_PIPU_ENABLE; break;
|
||||
|
||||
case GPO_PUSH_PULL : register_temp |= 0; break;
|
||||
case GPO_OPEN_DTAIN : register_temp |= IOMUX_PINCM_HIZ1_ENABLE; break;
|
||||
case GPO_AF_PUSH_PULL : register_temp |= 0; break;
|
||||
case GPO_AF_OPEN_DTAIN : register_temp |= IOMUX_PINCM_HIZ1_ENABLE; break;
|
||||
}
|
||||
|
||||
IOMUX->SECCFG.PINCM[gpio_iomux_index[io_group * 32 + io_pin]] = register_temp;
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_gpio
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_gpio_h_
|
||||
#define _zf_driver_gpio_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
// 根据实际的芯片来进行定义
|
||||
#define GPIO_GROUP_MAX ( 2 ) // 引脚组数量
|
||||
#define GPIO_GROUP_PIN_NUMBER_MAX ( 32 ) // 每个组引脚上限
|
||||
|
||||
// 宏定义函数需要通过枚举来检索 IO 因此需要获取 IO 组别和下标信息 这里就定义偏移量和掩码
|
||||
#define GPIO_PIN_INDEX_OFFSET ( 0 ) // 将下标信息保存在低位 方便直接使用
|
||||
#define GPIO_PIN_INDEX_MASK ( 0x1F ) // 由于范围是 [0, 31] 占 5bit 掩码就是 0x1F
|
||||
|
||||
#define GPIO_GROUP_INDEX_OFFSET ( 5 ) // 低 5bit 存储了下标 那么位移 5
|
||||
#define GPIO_GROUP_INDEX_MASK ( 0x07 ) // 这里根据情况来设置掩码
|
||||
|
||||
typedef enum // 枚举 GPIO 引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
A0 = GPIO_GROUP_PIN_NUMBER_MAX * 0,
|
||||
A1 , A2 , A3 , A4 , A5 , A6 , A7 ,
|
||||
A8 , A9 , A10, A11, A12, A13, A14, A15,
|
||||
A16, A17, A18, A19, A20, A21, A22, A23,
|
||||
A24, A25, A26, A27, A28, A29, A30, A31,
|
||||
|
||||
B0 = GPIO_GROUP_PIN_NUMBER_MAX * 1,
|
||||
B1 , B2 , B3 , B4 , B5 , B6 , B7 ,
|
||||
B8 , B9 , B10, B11, B12, B13, B14, B15,
|
||||
B16, B17, B18, B19, B20, B21, B22, B23,
|
||||
B24, B25, B26, B27,
|
||||
}gpio_pin_enum;
|
||||
|
||||
typedef enum // 枚举端口方向 此枚举定义不允许用户修改
|
||||
{
|
||||
GPI = 0x00, // 定义管脚输入
|
||||
GPO = 0x10, // 定义管脚输出
|
||||
}gpio_dir_enum;
|
||||
|
||||
typedef enum // 枚举端口模式 此枚举定义不允许用户修改
|
||||
{
|
||||
GPI_ANAOG_IN = 0x01, // [输入] [定义管脚模拟输入]
|
||||
GPI_FLOATING_IN = 0x02, // [输入] [定义管脚浮空输入]
|
||||
GPI_PULL_DOWN = 0x03, // [输入] [定义管脚下拉输入]
|
||||
GPI_PULL_UP = 0x04, // [输入] [定义管脚上拉输入]
|
||||
|
||||
GPO_PUSH_PULL = 0x11, // [输出] [定义管脚推挽输出]
|
||||
GPO_OPEN_DTAIN = 0x12, // [输出] [定义管脚开漏输出]
|
||||
GPO_AF_PUSH_PULL = 0x13, // [输出] [定义管脚复用推挽输出]
|
||||
GPO_AF_OPEN_DTAIN = 0x14, // [输出] [定义管脚复用开漏输出]
|
||||
}gpio_mode_enum;
|
||||
|
||||
typedef enum // 枚举端口复用 此枚举定义不允许用户修改
|
||||
{
|
||||
GPIO_AF0 = 0 , // 引脚复用功能选项 0
|
||||
GPIO_AF1 = 1 , // 引脚复用功能选项 1
|
||||
GPIO_AF2 = 2 , // 引脚复用功能选项 2
|
||||
GPIO_AF3 = 3 , // 引脚复用功能选项 3
|
||||
GPIO_AF4 = 4 , // 引脚复用功能选项 4
|
||||
GPIO_AF5 = 5 , // 引脚复用功能选项 5
|
||||
GPIO_AF6 = 6 , // 引脚复用功能选项 6
|
||||
GPIO_AF7 = 7 , // 引脚复用功能选项 7
|
||||
GPIO_AF8 = 8 , // 引脚复用功能选项 8
|
||||
GPIO_AF9 = 9 , // 引脚复用功能选项 9
|
||||
GPIO_AF10 = 10, // 引脚复用功能选项 10
|
||||
GPIO_AF11 = 11, // 引脚复用功能选项 11
|
||||
GPIO_AF12 = 12, // 引脚复用功能选项 12
|
||||
GPIO_AF13 = 13, // 引脚复用功能选项 13
|
||||
GPIO_AF14 = 14, // 引脚复用功能选项 14
|
||||
GPIO_AF15 = 15, // 引脚复用功能选项 15
|
||||
}gpio_af_enum;
|
||||
|
||||
typedef enum // 枚举端口电平 此枚举定义不允许用户修改
|
||||
{
|
||||
GPIO_LOW = 0x00, // 定义管脚初始化电平为低
|
||||
GPIO_HIGH = 0x01, // 定义管脚初始化电平为高
|
||||
}gpio_level_enum;
|
||||
|
||||
extern GPIO_Regs *gpio_group[GPIO_GROUP_MAX];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 对应 IO 复位为低电平
|
||||
// 参数说明 x 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_low(D5);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define gpio_low(pin) (gpio_group[((pin) >> GPIO_GROUP_INDEX_OFFSET)]->DOUTCLR31_0 |= (0x00000001 << ((pin) & GPIO_PIN_INDEX_MASK)))
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 对应 IO 置位为高电平
|
||||
// 参数说明 x 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_high(D5);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define gpio_high(pin) (gpio_group[((pin) >> GPIO_GROUP_INDEX_OFFSET)]->DOUTSET31_0 |= (0x00000001 << ((pin) & GPIO_PIN_INDEX_MASK)))
|
||||
|
||||
void gpio_set_level (gpio_pin_enum pin, const uint8 dat);
|
||||
uint8 gpio_get_level (gpio_pin_enum pin);
|
||||
void gpio_toggle_level (gpio_pin_enum pin);
|
||||
void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum mode);
|
||||
|
||||
void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, const uint8 dat, gpio_mode_enum mode);
|
||||
void afio_init (gpio_pin_enum pin, gpio_dir_enum dir, gpio_af_enum af, gpio_mode_enum mode);
|
||||
|
||||
#ifdef COMPATIBLE_WITH_OLDER_VERSIONS // 兼容旧版本开源库接口名称
|
||||
#define gpio_set(pin, dat) (gpio_set_level((pin), (dat)))
|
||||
#define gpio_get(pin) (gpio_get_level((pin)))
|
||||
#define gpio_dir(pin, dir, mode) (gpio_set_dir((pin), (dir), (mode)))
|
||||
#define gpio_toggle(pin) (gpio_toggle_level((pin)))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,318 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pit
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_common_interrupt.h"
|
||||
#include "zf_driver_timer.h"
|
||||
|
||||
#include "zf_driver_pit.h"
|
||||
|
||||
static void pit_callbakc_defalut (uint32 event, void *ptr);
|
||||
void_callback_uint32_ptr pit_callback_list[PIT_NUM] =
|
||||
{
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
void *pit_callback_ptr_list[PIT_NUM] =
|
||||
{
|
||||
pit_callbakc_defalut, pit_callbakc_defalut, pit_callbakc_defalut, pit_callbakc_defalut,
|
||||
pit_callbakc_defalut, pit_callbakc_defalut, pit_callbakc_defalut
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 中断默认回调函数
|
||||
// 参数说明 event 触发中断的事件 此处默认为 0
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void pit_callbakc_defalut (uint32 event, void *ptr)
|
||||
{
|
||||
(void)event;
|
||||
(void)ptr;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 中断使能
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_enable(pit_n);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_enable (pit_index_enum pit_n)
|
||||
{
|
||||
switch(pit_n)
|
||||
{
|
||||
case PIT_TIM_A0 : TIMA0 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_A1 : TIMA1 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_G0 : TIMG0 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_G6 : TIMG6 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_G7 : TIMG7 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_G8 : TIMG8 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case PIT_TIM_G12: TIMG12->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 中断禁止
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_disable(pit_n);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_disable (pit_index_enum pit_n)
|
||||
{
|
||||
switch(pit_n)
|
||||
{
|
||||
case PIT_TIM_A0 : TIMA0 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_A1 : TIMA1 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_G0 : TIMG0 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_G6 : TIMG6 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_G7 : TIMG7 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_G8 : TIMG8 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case PIT_TIM_G12: TIMG12->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 初始化 一般调用 pit_ms_init 或 pit_us_init
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 参数说明 period PIT 周期 一般是芯片或者模块时钟频率计算
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_init (pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr)
|
||||
{
|
||||
// 如果程序在输出了断言信息 并且提示出错位置在这里
|
||||
// 就去查看你在什么地方调用这个函数 检查你的传入参数
|
||||
// 这里是检查是否有重复使用定时器
|
||||
// 比如初始化了 TIM1_PWM 然后又初始化成 TIM1_PIT 这种用法是不允许的
|
||||
zf_assert(timer_funciton_check((timer_index_enum)pit_n, TIMER_FUNCTION_TIMER));
|
||||
// 如果是这一行报错 那我就得问问你为什么周期写的是 0
|
||||
zf_assert(0 != period);
|
||||
zf_assert(0x7FF0 >= period);
|
||||
|
||||
timer_clock_enable((timer_index_enum)pit_n); // 使能时钟
|
||||
|
||||
pit_callback_ptr_list[pit_n] = ptr;
|
||||
pit_callback_list[pit_n] = (NULL == callback) ? (pit_callbakc_defalut) : (callback);
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch(pit_n)
|
||||
{
|
||||
case PIT_TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case PIT_TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case PIT_TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case PIT_TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case PIT_TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case PIT_TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case PIT_TIM_G12 : timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
timer_obj->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_REPEAT_REPEAT_1;
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_BUSCLK_SEL_ENABLE;
|
||||
if(TIM_G0 == pit_n || TIM_G8 == pit_n)
|
||||
{
|
||||
timer_obj->CLKDIV = 0;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->CLKDIV = 1;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
}
|
||||
timer_obj->COUNTERREGS.LOAD = period;
|
||||
timer_obj->CPU_INT.IMASK |= GPTIMER_CPU_INT_IMASK_L_SET;
|
||||
|
||||
const IRQn_Type irq_index[PIT_NUM] = {
|
||||
TIMA0_INT_IRQn, TIMA1_INT_IRQn, TIMG0_INT_IRQn, TIMG6_INT_IRQn,
|
||||
TIMG7_INT_IRQn, TIMG8_INT_IRQn, TIMG12_INT_IRQn};
|
||||
interrupt_enable(irq_index[(pit_n)]);
|
||||
|
||||
pit_enable(pit_n);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIM PIT 中断初始化 us 周期
|
||||
// 参数说明 pit_n 使用的 PIT 编号
|
||||
// 参数说明 us PIT 周期 us 级别
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_us_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_us_init(pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr)
|
||||
{
|
||||
// 如果程序在输出了断言信息 并且提示出错位置在这里
|
||||
// 就去查看你在什么地方调用这个函数 检查你的传入参数
|
||||
// 这里是检查是否有重复使用定时器
|
||||
// 比如初始化了 TIM1_PWM 然后又初始化成 TIM1_PIT 这种用法是不允许的
|
||||
zf_assert(timer_funciton_check((timer_index_enum)pit_n, TIMER_FUNCTION_TIMER));
|
||||
// 如果是这一行报错 那我就得问问你为什么周期写的是 0
|
||||
zf_assert(0 != period);
|
||||
zf_assert(0x7FF0 >= period);
|
||||
|
||||
timer_clock_enable((timer_index_enum)pit_n); // 使能时钟
|
||||
|
||||
pit_callback_ptr_list[pit_n] = ptr;
|
||||
pit_callback_list[pit_n] = (NULL == callback) ? (pit_callbakc_defalut) : (callback);
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch(pit_n)
|
||||
{
|
||||
case PIT_TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case PIT_TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case PIT_TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case PIT_TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case PIT_TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case PIT_TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case PIT_TIM_G12 : timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
timer_obj->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_REPEAT_REPEAT_1;;
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_MFCLK_SEL_ENABLE;
|
||||
timer_obj->CLKDIV = 3;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
timer_obj->COUNTERREGS.LOAD = period;
|
||||
timer_obj->CPU_INT.IMASK |= GPTIMER_CPU_INT_IMASK_L_SET;
|
||||
|
||||
const IRQn_Type irq_index[PIT_NUM] = {
|
||||
TIMA0_INT_IRQn, TIMA1_INT_IRQn, TIMG0_INT_IRQn, TIMG6_INT_IRQn,
|
||||
TIMG7_INT_IRQn, TIMG8_INT_IRQn, TIMG12_INT_IRQn};
|
||||
interrupt_enable(irq_index[(pit_n)]);
|
||||
|
||||
pit_enable(pit_n);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIM PIT 中断初始化 ms 周期
|
||||
// 参数说明 pit_n 使用的 PIT 编号
|
||||
// 参数说明 ms PIT 周期 ms 级别
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_ms_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_ms_init(pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr)
|
||||
{
|
||||
// 如果程序在输出了断言信息 并且提示出错位置在这里
|
||||
// 就去查看你在什么地方调用这个函数 检查你的传入参数
|
||||
// 这里是检查是否有重复使用定时器
|
||||
// 比如初始化了 TIM1_PWM 然后又初始化成 TIM1_PIT 这种用法是不允许的
|
||||
zf_assert(timer_funciton_check((timer_index_enum)pit_n, TIMER_FUNCTION_TIMER));
|
||||
// 如果是这一行报错 那我就得问问你为什么周期写的是 0
|
||||
zf_assert(0 != period);
|
||||
zf_assert(0x7FF0 >= period);
|
||||
|
||||
timer_clock_enable((timer_index_enum)pit_n); // 使能时钟
|
||||
|
||||
pit_callback_ptr_list[pit_n] = ptr;
|
||||
pit_callback_list[pit_n] = (NULL == callback) ? (pit_callbakc_defalut) : (callback);
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch(pit_n)
|
||||
{
|
||||
case PIT_TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case PIT_TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case PIT_TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case PIT_TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case PIT_TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case PIT_TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case PIT_TIM_G12 : timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
timer_obj->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_REPEAT_REPEAT_1;
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_MFCLK_SEL_ENABLE;
|
||||
timer_obj->CLKDIV = 7;
|
||||
if(period <= 20)
|
||||
{
|
||||
switch(period)
|
||||
{
|
||||
case 1 : timer_obj->COMMONREGS.CPS = 180 ; break;
|
||||
case 2 : timer_obj->COMMONREGS.CPS = 203 ; break;
|
||||
case 3 : timer_obj->COMMONREGS.CPS = 220 ; break;
|
||||
case 4 : timer_obj->COMMONREGS.CPS = 225 ; break;
|
||||
case 5 : timer_obj->COMMONREGS.CPS = 229 ; break;
|
||||
case 6 : timer_obj->COMMONREGS.CPS = 233 ; break;
|
||||
case 7 : timer_obj->COMMONREGS.CPS = 236 ; break;
|
||||
case 8 : timer_obj->COMMONREGS.CPS = 239 ; break;
|
||||
case 9 : timer_obj->COMMONREGS.CPS = 240 ; break;
|
||||
case 10 : timer_obj->COMMONREGS.CPS = 241 ; break;
|
||||
case 11 : timer_obj->COMMONREGS.CPS = 242 ; break;
|
||||
case 12 : timer_obj->COMMONREGS.CPS = 242 ; break;
|
||||
case 13 : timer_obj->COMMONREGS.CPS = 244 ; break;
|
||||
case 14 : timer_obj->COMMONREGS.CPS = 245 ; break;
|
||||
case 15 : timer_obj->COMMONREGS.CPS = 245 ; break;
|
||||
case 16 : timer_obj->COMMONREGS.CPS = 245 ; break;
|
||||
case 17 : timer_obj->COMMONREGS.CPS = 246 ; break;
|
||||
case 18 : timer_obj->COMMONREGS.CPS = 246 ; break;
|
||||
case 19 : timer_obj->COMMONREGS.CPS = 246 ; break;
|
||||
case 20 : timer_obj->COMMONREGS.CPS = 247 ; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->COMMONREGS.CPS = 250 ;
|
||||
}
|
||||
|
||||
if(PIT_TIM_G12 == pit_n)
|
||||
{
|
||||
timer_obj->COUNTERREGS.LOAD = period * 2 * 250;
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->COUNTERREGS.LOAD = period * 2;
|
||||
}
|
||||
timer_obj->CPU_INT.IMASK |= GPTIMER_CPU_INT_IMASK_L_SET;
|
||||
|
||||
const IRQn_Type irq_index[PIT_NUM] = {
|
||||
TIMA0_INT_IRQn, TIMA1_INT_IRQn, TIMG0_INT_IRQn, TIMG6_INT_IRQn,
|
||||
TIMG7_INT_IRQn, TIMG8_INT_IRQn, TIMG12_INT_IRQn};
|
||||
interrupt_enable(irq_index[(pit_n)]);
|
||||
|
||||
pit_enable(pit_n);
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pit
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_pit_h_
|
||||
#define _zf_driver_pit_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#include "zf_driver_timer.h"
|
||||
|
||||
typedef enum // 枚举 PIT
|
||||
{
|
||||
PIT_TIM_A0 ,
|
||||
PIT_TIM_A1 ,
|
||||
PIT_TIM_G0 ,
|
||||
PIT_TIM_G6 ,
|
||||
PIT_TIM_G7 ,
|
||||
PIT_TIM_G8 ,
|
||||
PIT_TIM_G12 ,
|
||||
}pit_index_enum;
|
||||
|
||||
#define PIT_NUM ( 7 )
|
||||
|
||||
extern void_callback_uint32_ptr pit_callback_list[PIT_NUM];
|
||||
extern void *pit_callback_ptr_list[PIT_NUM];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 中断使能
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_enable(pit_n);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_enable (pit_index_enum pit_n);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 中断禁止
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_disable(pit_n);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_disable (pit_index_enum pit_n);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PIT 初始化 一般调用 pit_ms_init 或 pit_us_init
|
||||
// 参数说明 pit_n PIT 外设模块号
|
||||
// 参数说明 period PIT 周期 一般是芯片或者模块时钟频率计算
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_init (pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIM PIT 中断初始化 us 周期
|
||||
// 参数说明 pit_n 使用的 PIT 编号
|
||||
// 参数说明 period PIT 周期 us 级别
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_us_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_us_init(pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIM PIT 中断初始化 ms 周期
|
||||
// 参数说明 pit_n 使用的 PIT 编号
|
||||
// 参数说明 period PIT 周期 ms 级别
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_ms_init(pit_n, period, callback, NULL);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_ms_init(pit_index_enum pit_n, uint32 period, void_callback_uint32_ptr callback, void *ptr);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,188 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pwm
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_gpio.h"
|
||||
#include "zf_driver_timer.h"
|
||||
|
||||
#include "zf_driver_pwm.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PWM 更新占空比
|
||||
// 参数说明 pin 选择 PWM 引脚
|
||||
// 参数说明 duty 设置占空比
|
||||
// 返回参数 void
|
||||
// 使用示例 pwm_set_duty(TIM5_PWMCH1_A0, PWM_DUTY_MAX / 4);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pwm_set_duty (pwm_channel_enum pin, const uint32 duty)
|
||||
{
|
||||
// 如果是这一行报错 那你得去看看最大占空比是限定的多少 占空比写入错误
|
||||
zf_assert(PWM_DUTY_MAX >= duty); // 占空比写入错误
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch((pin >> PWM_INDEX_OFFSET) & PWM_INDEX_MASK)
|
||||
{
|
||||
case PWM_TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case PWM_TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case PWM_TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case PWM_TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case PWM_TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case PWM_TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case PWM_TIM_G12: timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
uint16 period_temp = timer_obj->COUNTERREGS.LOAD; // 获取自动重装载值
|
||||
uint16 match_temp = (uint16)(period_temp * ((float)duty / PWM_DUTY_MAX)); // 计算占空比
|
||||
uint32 channel_index = (pin >> PWM_CHANNEL_OFFSET) & PWM_CHANNEL_MASK;
|
||||
|
||||
if(0 == duty)
|
||||
{
|
||||
timer_obj->COMMONREGS.ODIS |= (GPTIMER_ODIS_C0CCP0_CCP_OUTPUT_LOW << channel_index);
|
||||
}
|
||||
if(2 > channel_index)
|
||||
{
|
||||
timer_obj->COUNTERREGS.CC_01[channel_index % 2] =
|
||||
(match_temp == period_temp) ? period_temp + 1 : match_temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->COUNTERREGS.CC_23[channel_index % 2] =
|
||||
(match_temp == period_temp) ? period_temp + 1 : match_temp;
|
||||
}
|
||||
if(duty)
|
||||
{
|
||||
timer_obj->COMMONREGS.ODIS &= ~(GPTIMER_ODIS_C0CCP0_CCP_OUTPUT_LOW << channel_index);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PWM 初始化
|
||||
// 参数说明 pin 选择 PWM 引脚
|
||||
// 参数说明 freq 设置频率 同个模块只有最后一次设置生效
|
||||
// 参数说明 duty 设置占空比
|
||||
// 返回参数 void
|
||||
// 使用示例 pwm_init(TIM5_PWMCH1_A0, 17000, PWM_DUTY_MAX / 2);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pwm_init (pwm_channel_enum pin, const uint32 freq, const uint32 duty)
|
||||
{
|
||||
uint8 tim_index = (pin >> PWM_INDEX_OFFSET) & PWM_INDEX_MASK;
|
||||
// 如果程序在输出了断言信息 并且提示出错位置在这里
|
||||
// 就去查看你在什么地方调用这个函数 检查你的传入参数
|
||||
// 这里是检查是否有重复使用定时器
|
||||
// 比如初始化了 TIM1_PIT 然后又初始化成 TIM1_PWM 这种用法是不允许的
|
||||
zf_assert(timer_funciton_check((timer_index_enum)(tim_index), TIMER_FUNCTION_PWM));
|
||||
// 如果是这一行报错 那你得去看看最大占空比是限定的多少 占空比写入错误
|
||||
zf_assert(PWM_DUTY_MAX >= duty);
|
||||
|
||||
timer_clock_enable((timer_index_enum)(tim_index));
|
||||
|
||||
afio_init((gpio_pin_enum)(pin & PWM_PIN_INDEX_MASK), GPO, (gpio_af_enum)((pin >> PWM_PIN_AF_OFFSET) & PWM_PIN_AF_MASK), GPO_AF_PUSH_PULL); // 初始化引脚
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch(tim_index)
|
||||
{
|
||||
case PWM_TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case PWM_TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case PWM_TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case PWM_TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case PWM_TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case PWM_TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case PWM_TIM_G12: timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
timer_obj->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_REPEAT_REPEAT_1;
|
||||
|
||||
uint32 clock_selcet = 0;
|
||||
uint8 div_temp = 1;
|
||||
uint16 psc_temp = 1;
|
||||
uint32 clock_temp = 0;
|
||||
if(PWM_TIM_G0 == tim_index || PWM_TIM_G8 == tim_index)
|
||||
{
|
||||
clock_selcet = 40000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
clock_selcet = 80000000;
|
||||
}
|
||||
for(;;)
|
||||
{
|
||||
clock_temp = clock_selcet / freq / div_temp / psc_temp;
|
||||
if(0xFFF0 < clock_temp)
|
||||
{
|
||||
psc_temp ++;
|
||||
if(256 == psc_temp)
|
||||
{
|
||||
psc_temp = 1;
|
||||
div_temp += 1;
|
||||
}
|
||||
if(9 == div_temp)
|
||||
{
|
||||
clock_selcet = 4000000;
|
||||
psc_temp = 1;
|
||||
div_temp = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
timer_obj->CLKSEL = (4000000 == clock_selcet) ? (GPTIMER_CLKSEL_MFCLK_SEL_ENABLE) : (GPTIMER_CLKSEL_BUSCLK_SEL_ENABLE);
|
||||
timer_obj->CLKDIV = div_temp - 1;
|
||||
timer_obj->COMMONREGS.CPS = psc_temp - 1;
|
||||
timer_obj->COUNTERREGS.LOAD = clock_selcet / freq / div_temp / psc_temp - 1;
|
||||
|
||||
uint32 channel_index = (pin >> PWM_CHANNEL_OFFSET) & PWM_CHANNEL_MASK;
|
||||
timer_obj->COMMONREGS.CCPD |= GPTIMER_CCPD_C0CCP0_OUTPUT << ((pin >> PWM_CHANNEL_OFFSET) & PWM_CHANNEL_MASK);
|
||||
if(2 > channel_index)
|
||||
{
|
||||
timer_obj->COUNTERREGS.CCCTL_01[channel_index % 2] = (channel_index << GPTIMER_CCCTL_01_CC2SELU_OFS) | (channel_index << GPTIMER_CCCTL_01_CC2SELD_OFS);
|
||||
timer_obj->COUNTERREGS.CCACT_01[channel_index % 2] = GPTIMER_CCACT_01_ZACT_CCP_HIGH | GPTIMER_CCACT_01_CUACT_CCP_LOW;
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->COUNTERREGS.CCCTL_01[channel_index % 2] = (channel_index << GPTIMER_CCCTL_23_CC2SELU_OFS) | (channel_index << GPTIMER_CCCTL_23_CC2SELD_OFS);
|
||||
timer_obj->COUNTERREGS.CCACT_23[channel_index % 2] = GPTIMER_CCACT_23_ZACT_CCP_HIGH | GPTIMER_CCACT_23_CUACT_CCP_LOW;
|
||||
}
|
||||
|
||||
pwm_set_duty(pin, duty);
|
||||
timer_obj->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED;
|
||||
}
|
||||
@@ -0,0 +1,241 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pwm
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_pwm_h_
|
||||
#define _zf_driver_pwm_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#include "zf_driver_timer.h"
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
#define PWM_DUTY_MAX ( 10000 )
|
||||
|
||||
#define PWM_NUM_MAX ( 7 ) // 总共最多 PWM_NUM_MAX 个 PWM
|
||||
|
||||
typedef enum // 枚举 PWM
|
||||
{
|
||||
PWM_TIM_A0 ,
|
||||
PWM_TIM_A1 ,
|
||||
PWM_TIM_G0 ,
|
||||
PWM_TIM_G6 ,
|
||||
PWM_TIM_G7 ,
|
||||
PWM_TIM_G8 ,
|
||||
PWM_TIM_G12 ,
|
||||
}pwm_index_enum;
|
||||
|
||||
// 定义引脚要用的宏定义
|
||||
// bit[11:0 ] 固定为引脚索引
|
||||
// bit[15:12] 固定为引脚复用
|
||||
// bit[19:16] 在 PWM 模块中为 PWM 索引
|
||||
// bit[23:20] 在 PWM 模块中为 CHANNEL 索引
|
||||
|
||||
#define PWM_PIN_INDEX_OFFSET ( 0 ) // bit[11:0 ] 存储 GPIO 的索引号
|
||||
#define PWM_PIN_INDEX_MASK ( 0x0FFF ) // 宽度 12bit 因此掩码为 0x0FFF
|
||||
|
||||
#define PWM_PIN_AF_OFFSET ( 12 ) // bit[15:12] 存储 GPIO 的复用功能索引
|
||||
#define PWM_PIN_AF_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0xF
|
||||
|
||||
#define PWM_INDEX_OFFSET ( 16 ) // bit[19:16] 存储 PWM 索引
|
||||
#define PWM_INDEX_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0xF
|
||||
|
||||
#define PWM_CHANNEL_OFFSET ( 20 ) // bit[23:20] 存储 CHANNEL 索引
|
||||
#define PWM_CHANNEL_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0xF
|
||||
|
||||
typedef enum // 枚举 PWM 通道索引 此枚举定义不允许用户修改
|
||||
{
|
||||
PWM_CH0 ,
|
||||
PWM_CH1 ,
|
||||
PWM_CH2 ,
|
||||
PWM_CH3 ,
|
||||
}pwm_channel_index_enum;
|
||||
|
||||
typedef enum // 枚举 PWM 通道 此枚举定义不允许用户修改
|
||||
{
|
||||
// ----------------------------------------------- PWM_TIM_A0 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_A0_CH0_A0 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A0 )),
|
||||
PWM_TIM_A0_CH0_A8 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A8 )),
|
||||
PWM_TIM_A0_CH0_A21 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A21)),
|
||||
PWM_TIM_A0_CH0_B8 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B8 )),
|
||||
PWM_TIM_A0_CH0_B14 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B14)),
|
||||
|
||||
PWM_TIM_A0_CH1_A1 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A1 )),
|
||||
PWM_TIM_A0_CH1_A3 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A3 )),
|
||||
PWM_TIM_A0_CH1_A7 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A7 )),
|
||||
PWM_TIM_A0_CH1_A9 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A9 )),
|
||||
PWM_TIM_A0_CH1_A22 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A22)),
|
||||
PWM_TIM_A0_CH1_B9 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B9 )),
|
||||
PWM_TIM_A0_CH1_B12 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B12)),
|
||||
PWM_TIM_A0_CH1_B20 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B20)),
|
||||
|
||||
PWM_TIM_A0_CH2_A3 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A3 )),
|
||||
PWM_TIM_A0_CH2_A7 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A7 )),
|
||||
PWM_TIM_A0_CH2_A10 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A10)),
|
||||
PWM_TIM_A0_CH2_A15 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A15)),
|
||||
PWM_TIM_A0_CH2_B0 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B0 )),
|
||||
PWM_TIM_A0_CH2_B4 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B4 )),
|
||||
PWM_TIM_A0_CH2_B12 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B12)),
|
||||
PWM_TIM_A0_CH2_B17 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B17)),
|
||||
PWM_TIM_A0_CH2_B20 = ((PWM_CH2 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B20)),
|
||||
|
||||
PWM_TIM_A0_CH3_A4 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A4 )),
|
||||
PWM_TIM_A0_CH3_A12 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A12)),
|
||||
PWM_TIM_A0_CH3_A17 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A17)),
|
||||
PWM_TIM_A0_CH3_A23 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A23)),
|
||||
PWM_TIM_A0_CH3_A25 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A25)),
|
||||
PWM_TIM_A0_CH3_A28 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A28)),
|
||||
PWM_TIM_A0_CH3_B2 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B2 )),
|
||||
PWM_TIM_A0_CH3_B13 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B13)),
|
||||
PWM_TIM_A0_CH3_B24 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B24)),
|
||||
PWM_TIM_A0_CH3_B26 = ((PWM_CH3 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B26)),
|
||||
// ----------------------------------------------- PWM_TIM_A0 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_A1 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_A1_CH0_A10 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A10)),
|
||||
PWM_TIM_A1_CH0_A15 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A15)),
|
||||
PWM_TIM_A1_CH0_A17 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A17)),
|
||||
PWM_TIM_A1_CH0_A28 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A28)),
|
||||
PWM_TIM_A1_CH0_B0 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B0 )),
|
||||
PWM_TIM_A1_CH0_B2 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (B2 )),
|
||||
PWM_TIM_A1_CH0_B4 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B4 )),
|
||||
PWM_TIM_A1_CH0_B17 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B17)),
|
||||
PWM_TIM_A1_CH0_B26 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B26)),
|
||||
|
||||
PWM_TIM_A1_CH1_A11 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A11)),
|
||||
PWM_TIM_A1_CH1_A16 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A16)),
|
||||
PWM_TIM_A1_CH1_A18 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A18)),
|
||||
PWM_TIM_A1_CH1_A24 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A24)),
|
||||
PWM_TIM_A1_CH1_A31 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A31)),
|
||||
PWM_TIM_A1_CH1_B1 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B1 )),
|
||||
PWM_TIM_A1_CH1_B3 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (B3 )),
|
||||
PWM_TIM_A1_CH1_B5 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B5 )),
|
||||
PWM_TIM_A1_CH1_B18 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B18)),
|
||||
PWM_TIM_A1_CH1_B27 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_A1 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B27)),
|
||||
// ----------------------------------------------- PWM_TIM_A1 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_G0 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_G0_CH0_A5 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A5 )),
|
||||
PWM_TIM_G0_CH0_A12 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A12)),
|
||||
PWM_TIM_G0_CH0_A23 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A23)),
|
||||
PWM_TIM_G0_CH0_B10 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (B10)),
|
||||
|
||||
PWM_TIM_G0_CH1_A6 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A6 )),
|
||||
PWM_TIM_G0_CH1_A13 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A13)),
|
||||
PWM_TIM_G0_CH1_A24 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A24)),
|
||||
PWM_TIM_G0_CH1_B11 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G0 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (B11)),
|
||||
// ----------------------------------------------- PWM_TIM_G0 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_G6 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_G6_CH0_A5 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A5 )),
|
||||
PWM_TIM_G6_CH0_A21 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A21)),
|
||||
PWM_TIM_G6_CH0_A29 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A29)),
|
||||
PWM_TIM_G6_CH0_B2 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B2 )),
|
||||
PWM_TIM_G6_CH0_B6 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B6 )),
|
||||
PWM_TIM_G6_CH0_B10 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B10)),
|
||||
PWM_TIM_G6_CH0_B26 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B26)),
|
||||
|
||||
PWM_TIM_G6_CH1_A6 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A6 )),
|
||||
PWM_TIM_G6_CH1_A22 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A22)),
|
||||
PWM_TIM_G6_CH1_A30 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A30)),
|
||||
PWM_TIM_G6_CH1_B3 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B3 )),
|
||||
PWM_TIM_G6_CH1_B7 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (B7 )),
|
||||
PWM_TIM_G6_CH1_B11 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B11)),
|
||||
PWM_TIM_G6_CH1_B27 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G6 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B27)),
|
||||
// ----------------------------------------------- PWM_TIM_G6 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_G7 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_G7_CH0_A3 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A3 )),
|
||||
PWM_TIM_G7_CH0_A17 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A17)),
|
||||
PWM_TIM_G7_CH0_A23 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A23)),
|
||||
PWM_TIM_G7_CH0_A26 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A26)),
|
||||
PWM_TIM_G7_CH0_A28 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A28)),
|
||||
PWM_TIM_G7_CH0_B15 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B15)),
|
||||
|
||||
PWM_TIM_G7_CH1_A2 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A2 )),
|
||||
PWM_TIM_G7_CH1_A4 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A4 )),
|
||||
PWM_TIM_G7_CH1_A7 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A7 )),
|
||||
PWM_TIM_G7_CH1_A18 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A18)),
|
||||
PWM_TIM_G7_CH1_A24 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A24)),
|
||||
PWM_TIM_G7_CH1_A27 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A27)),
|
||||
PWM_TIM_G7_CH1_A31 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A31)),
|
||||
PWM_TIM_G7_CH1_B16 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B16)),
|
||||
PWM_TIM_G7_CH1_B19 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G7 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (B19)),
|
||||
// ----------------------------------------------- PWM_TIM_G7 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_G8 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_G8_CH0_A1 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF7 << PWM_PIN_AF_OFFSET) | (A1 )),
|
||||
PWM_TIM_G8_CH0_A3 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (A3 )),
|
||||
PWM_TIM_G8_CH0_A5 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (A5 )),
|
||||
PWM_TIM_G8_CH0_A7 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A7 )),
|
||||
PWM_TIM_G8_CH0_A21 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (A21)),
|
||||
PWM_TIM_G8_CH0_A23 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF8 << PWM_PIN_AF_OFFSET) | (A23)),
|
||||
PWM_TIM_G8_CH0_A26 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A26)),
|
||||
PWM_TIM_G8_CH0_A29 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A29)),
|
||||
PWM_TIM_G8_CH0_B6 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B6 )),
|
||||
PWM_TIM_G8_CH0_B10 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B10)),
|
||||
PWM_TIM_G8_CH0_B15 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B15)),
|
||||
PWM_TIM_G8_CH0_B21 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B21)),
|
||||
|
||||
PWM_TIM_G8_CH1_A0 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A0 )),
|
||||
PWM_TIM_G8_CH1_A2 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (A2 )),
|
||||
PWM_TIM_G8_CH1_A4 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (A4 )),
|
||||
PWM_TIM_G8_CH1_A6 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF2 << PWM_PIN_AF_OFFSET) | (A6 )),
|
||||
PWM_TIM_G8_CH1_A22 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (A22)),
|
||||
PWM_TIM_G8_CH1_A27 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A27)),
|
||||
PWM_TIM_G8_CH1_A30 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A30)),
|
||||
PWM_TIM_G8_CH1_B7 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B7 )),
|
||||
PWM_TIM_G8_CH1_B11 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B11)),
|
||||
PWM_TIM_G8_CH1_B16 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B16)),
|
||||
PWM_TIM_G8_CH1_B19 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B19)),
|
||||
PWM_TIM_G8_CH1_B22 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G8 << PWM_INDEX_OFFSET) | (GPIO_AF3 << PWM_PIN_AF_OFFSET) | (B22)),
|
||||
// ----------------------------------------------- PWM_TIM_G8 PWM CHANNEL -----------------------------------------------
|
||||
|
||||
// ----------------------------------------------- PWM_TIM_G12 PWM CHANNEL -----------------------------------------------
|
||||
PWM_TIM_G12_CH0_A10 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF6 << PWM_PIN_AF_OFFSET) | (A10)),
|
||||
PWM_TIM_G12_CH0_A14 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A14)),
|
||||
PWM_TIM_G12_CH0_B13 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (B13)),
|
||||
PWM_TIM_G12_CH0_B20 = ((PWM_CH0 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B20)),
|
||||
|
||||
PWM_TIM_G12_CH1_A25 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF4 << PWM_PIN_AF_OFFSET) | (A25)),
|
||||
PWM_TIM_G12_CH1_A31 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (A31)),
|
||||
PWM_TIM_G12_CH1_B14 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B14)),
|
||||
PWM_TIM_G12_CH1_B24 = ((PWM_CH1 << PWM_CHANNEL_OFFSET) | (PWM_TIM_G12 << PWM_INDEX_OFFSET) | (GPIO_AF5 << PWM_PIN_AF_OFFSET) | (B24)),
|
||||
// ----------------------------------------------- PWM_TIM_G12 PWM CHANNEL -----------------------------------------------
|
||||
}pwm_channel_enum;
|
||||
|
||||
void pwm_set_duty (pwm_channel_enum pin, const uint32 duty);
|
||||
void pwm_init (pwm_channel_enum pin, const uint32 freq, const uint32 duty);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,742 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_iic
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
|
||||
#include "zf_driver_soft_iic.h"
|
||||
|
||||
#define SOFT_IIC_SDA_IO_SWITCH (0) // 是否需要 SDA 进行 I/O 切换 0-不需要 1-需要
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 延时
|
||||
// 参数说明 delay 延时次数
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_delay(1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
//static void soft_iic_delay (vuint32 delay)
|
||||
//{
|
||||
// volatile uint32 count = delay;
|
||||
// while(count --);
|
||||
//}
|
||||
#define soft_iic_delay(x) for(vuint32 i = x; i --; )
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC START 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_start(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_start (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 高电平
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 高电平
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_low(soft_iic_obj->sda_pin); // SDA 先拉低
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 再拉低
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC STOP 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_stop(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_stop (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
gpio_low(soft_iic_obj->sda_pin); // SDA 低电平
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 先拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 再拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 发送 ACK/NAKC 信号 内部调用
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 ack ACK 电平
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_send_ack(soft_iic_obj, 1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_send_ack (soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
|
||||
if(ack)
|
||||
{
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 拉高
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_low(soft_iic_obj->sda_pin); // SDA 拉低
|
||||
}
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 拉低
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 拉高
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 获取 ACK/NAKC 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 uint8 ACK 状态
|
||||
// 使用示例 soft_iic_wait_ack(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_wait_ack (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 temp = 0;
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 高电平 释放 SDA
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir((gpio_pin_enum)soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 高电平
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
if(gpio_get_level((gpio_pin_enum)soft_iic_obj->sda_pin))
|
||||
{
|
||||
temp = 1;
|
||||
}
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir((gpio_pin_enum)soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 发送 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint8 ACK 状态
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_send_data (soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 temp = 0x80;
|
||||
|
||||
while(temp)
|
||||
{
|
||||
// gpio_set_level(soft_iic_obj->sda_pin, data & temp);
|
||||
((data & temp) ? (gpio_high(soft_iic_obj->sda_pin)) : (gpio_low(soft_iic_obj->sda_pin)));
|
||||
temp >>= 1;
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay / 2);
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 拉低
|
||||
soft_iic_delay(soft_iic_obj->delay / 2);
|
||||
}
|
||||
return ((soft_iic_wait_ack(soft_iic_obj) == 1) ? 0 : 1 );
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 ack ACK 或 NACK
|
||||
// 返回参数 uint8 数据
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_read_data (soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 data = 0x00;
|
||||
uint8 temp = 8;
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_high(soft_iic_obj->sda_pin); // SDA 高电平 释放 SDA
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir((gpio_pin_enum)soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
||||
#endif
|
||||
|
||||
while(temp --)
|
||||
{
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 拉低
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
gpio_high(soft_iic_obj->scl_pin); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
data = ((data << 1) | gpio_get_level((gpio_pin_enum)soft_iic_obj->sda_pin));
|
||||
}
|
||||
gpio_low(soft_iic_obj->scl_pin); // SCL 低电平
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir((gpio_pin_enum)soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_send_ack(soft_iic_obj, ack);
|
||||
return data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit (soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_array(soft_iic_obj, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *data ++);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口器写 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit(soft_iic_obj, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit (soft_iic_info_struct *soft_iic_obj, const uint16 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_array(soft_iic_obj, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*data ++ & 0x00FF));
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_register(soft_iic_obj, 0x01, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_registers(soft_iic_obj, 0x01, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *data ++);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_register(soft_iic_obj, 0x0101, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_registers(soft_iic_obj, 0x0101, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*data ++ & 0x00FF));
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_read_8bit(soft_iic_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_read_8bit (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_8bit_array(soft_iic_obj, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_8bit_array (soft_iic_info_struct *soft_iic_obj, uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_iic_read_16bit(soft_iic_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_iic_read_16bit (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint16 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 0);
|
||||
temp = ((temp << 8)| soft_iic_read_data(soft_iic_obj, 1));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_16bit_array(soft_iic_obj, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_16bit_array (soft_iic_info_struct *soft_iic_obj, uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*data = ((*data << 8)| soft_iic_read_data(soft_iic_obj, 0 == len));
|
||||
data ++;
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_read_8bit_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_read_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_8bit_registers(soft_iic_obj, 0x01, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_iic_read_16bit_register(soft_iic_obj, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_iic_read_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint16 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 0);
|
||||
temp = ((temp << 8)| soft_iic_read_data(soft_iic_obj, 1));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_16bit_registers(soft_iic_obj, 0x0101, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*data = ((*data << 8)| soft_iic_read_data(soft_iic_obj, 0 == len));
|
||||
data ++;
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口传输 8bit 数组 先写后读取
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *write_data 发送数据存放缓冲区
|
||||
// 参数说明 write_len 发送缓冲区长度
|
||||
// 参数说明 *read_data 读取数据存放缓冲区
|
||||
// 参数说明 read_len 读取缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 iic_transfer_8bit_array(IIC_1, addr, data, 64, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_transfer_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *write_data, uint32 write_len, uint8 *read_data, uint32 read_len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != write_data);
|
||||
zf_assert(NULL != read_data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(write_len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *write_data ++);
|
||||
}
|
||||
if(read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(read_len --)
|
||||
{
|
||||
*read_data ++ = soft_iic_read_data(soft_iic_obj, 0 == read_len);
|
||||
}
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口传输 16bit 数组 先写后读取
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *write_data 发送数据存放缓冲区
|
||||
// 参数说明 write_len 发送缓冲区长度
|
||||
// 参数说明 *read_data 读取数据存放缓冲区
|
||||
// 参数说明 read_len 读取缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 iic_transfer_16bit_array(IIC_1, addr, data, 64, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_transfer_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *write_data, uint32 write_len, uint16 *read_data, uint32 read_len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != write_data);
|
||||
zf_assert(NULL != read_data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(write_len--)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*write_data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*write_data ++ & 0x00FF));
|
||||
}
|
||||
if(read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(read_len --)
|
||||
{
|
||||
*read_data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*read_data = ((*read_data << 8)| soft_iic_read_data(soft_iic_obj, 0 == read_len));
|
||||
read_data ++;
|
||||
}
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口传输 8bit 数组 先写后读取
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *write_data 发送数据存放缓冲区
|
||||
// 参数说明 write_len 发送缓冲区长度
|
||||
// 参数说明 *read_data 读取数据存放缓冲区
|
||||
// 参数说明 read_len 读取缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 iic_transfer_8bit_array(IIC_1, addr, data, 64, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_splicing_array (soft_iic_info_struct *soft_iic_obj, const uint8 *part1_data, uint32 part1_len, const uint8 *part2_data, uint32 part2_len)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(NULL != part1_data);
|
||||
zf_assert(NULL != part2_data);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(part1_len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *part1_data ++);
|
||||
}
|
||||
while(part2_len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *part2_data ++);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口 SCCB 模式向传感器寄存器写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_sccb_write_register(soft_iic_obj, 0x01, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_sccb_write_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 data)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口 SCCB 模式从传感器寄存器读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_sccb_read_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_sccb_read_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口初始化 默认 MASTER 模式 不提供 SLAVE 模式
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息存放结构体的指针
|
||||
// 参数说明 addr 软件 IIC 地址 这里需要注意 标准七位地址 最高位忽略 写入时请务必确认无误
|
||||
// 参数说明 delay 软件 IIC 延时 就是时钟高电平时间 越短 IIC 速率越高
|
||||
// 参数说明 scl_pin 软件 IIC 时钟引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 参数说明 sda_pin 软件 IIC 数据引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_init(&soft_iic_obj, addr, 100, B6, B7);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_init (soft_iic_info_struct *soft_iic_obj, uint8 addr, uint32 delay, gpio_pin_enum scl_pin, gpio_pin_enum sda_pin)
|
||||
{
|
||||
zf_assert(NULL != soft_iic_obj);
|
||||
zf_assert(scl_pin != sda_pin); // 醒醒! scl_pin 与 sda_pin 怎么能填同一个引脚?
|
||||
soft_iic_obj->scl_pin = scl_pin;
|
||||
soft_iic_obj->sda_pin = sda_pin;
|
||||
soft_iic_obj->addr = addr;
|
||||
soft_iic_obj->delay = delay;
|
||||
gpio_init(scl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 提取对应IO索引 AF功能编码
|
||||
gpio_init(sda_pin, GPO, GPIO_HIGH, GPO_OPEN_DTAIN); // 提取对应IO索引 AF功能编码
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_iic
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_soft_iic_h_
|
||||
#define _zf_driver_soft_iic_h_
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32 scl_pin; // 用于记录对应的引脚编号
|
||||
uint32 sda_pin; // 用于记录对应的引脚编号
|
||||
uint8 addr; // 器件地址 七位地址模式
|
||||
uint32 delay; // 模拟 IIC 软延时时长
|
||||
}soft_iic_info_struct;
|
||||
|
||||
void soft_iic_start (soft_iic_info_struct *soft_iic_obj);
|
||||
void soft_iic_stop (soft_iic_info_struct *soft_iic_obj);
|
||||
|
||||
uint8 soft_iic_send_data (soft_iic_info_struct *soft_iic_obj, const uint8 data);
|
||||
uint8 soft_iic_read_data (soft_iic_info_struct *soft_iic_obj, uint8 ack);
|
||||
|
||||
void soft_iic_write_8bit (soft_iic_info_struct *soft_iic_obj, const uint8 data);
|
||||
void soft_iic_write_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_16bit (soft_iic_info_struct *soft_iic_obj, const uint16 data);
|
||||
void soft_iic_write_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 data);
|
||||
void soft_iic_write_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 data);
|
||||
void soft_iic_write_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_iic_read_8bit (soft_iic_info_struct *soft_iic_obj);
|
||||
void soft_iic_read_8bit_array (soft_iic_info_struct *soft_iic_obj, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_iic_read_16bit (soft_iic_info_struct *soft_iic_obj);
|
||||
void soft_iic_read_16bit_array (soft_iic_info_struct *soft_iic_obj, uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_iic_read_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name);
|
||||
void soft_iic_read_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_iic_read_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name);
|
||||
void soft_iic_read_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, uint16 *data, uint32 len);
|
||||
|
||||
void soft_iic_transfer_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *write_data, uint32 write_len, uint8 *read_data, uint32 read_len);
|
||||
void soft_iic_transfer_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *write_data, uint32 write_len, uint16 *read_data, uint32 read_len);
|
||||
|
||||
void soft_iic_sccb_write_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 data);
|
||||
uint8 soft_iic_sccb_read_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name);
|
||||
|
||||
void soft_iic_write_splicing_array (soft_iic_info_struct *soft_iic_obj, const uint8 *part1_data, uint32 part1_len, const uint8 *part2_data, uint32 part2_len);
|
||||
|
||||
void soft_iic_init (soft_iic_info_struct *soft_iic_obj, uint8 addr, uint32 delay, gpio_pin_enum scl_pin, gpio_pin_enum sda_pin);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,867 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_spi
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
#include "zf_common_debug.h"
|
||||
|
||||
#include "zf_driver_spi.h"
|
||||
|
||||
static SPI_Regs *spi_list[SPI_NUM] = {SPI0, SPI1};
|
||||
|
||||
#define SPI_CTRL_CS(x, e) (void)x,(void)e // SPI 片选 ENABLE/DISABLE 控制片选 拉低/拉高
|
||||
#define SPI_CTRL_RX(x, e) (void)x,(void)e // SPI RX 使能 ENABLE/DISABLE
|
||||
|
||||
#define SPI_DATA_RX(x) (spi_list[x]->RXDATA) // SPI 读数据
|
||||
#define SPI_DATA_TX(x, data) (spi_list[x]->TXDATA = (data)) // SPI 写数据
|
||||
|
||||
#define SPI_STATE_BUY(x) (spi_list[x]->STAT & SPI_STAT_BUSY_ACTIVE) // SPI 忙 正在传输中
|
||||
#define SPI_STATE_TX_FIFO_FULL(x) (spi_list[x]->STAT & SPI_STAT_TNF_NOT_FULL) // SPI 发送缓冲器满了
|
||||
#define SPI_STATE_RX_AVAILABLE(x) (!(spi_list[x]->STAT & SPI_STAT_RFE_EMPTY)) // SPI 接收缓冲器收到一个有效数据
|
||||
#define SPI_STATE_TX_EMPTY(x) (spi_list[x]->STAT & SPI_STAT_TFE_EMPTY) // SPI 发送缓冲器空了
|
||||
|
||||
#ifndef SPI_SPEED_PRIORITY
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 8bit 数据读写
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint8 读取的数据
|
||||
// 使用示例 spi_8bit_data_handler(spi_index, 5);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint8 spi_8bit_data_handler (spi_index_enum spi_index, const uint8 data)
|
||||
{
|
||||
uint8 read_data = 0;
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, data); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
read_data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
while(SPI_STATE_BUY(spi_index) ){}; // 等待传输完毕
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
|
||||
return read_data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 16bit 数据读写
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint16 读取的数据
|
||||
// 使用示例 spi_16bit_data_handler(spi_index, 5);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint16 spi_16bit_data_handler (spi_index_enum spi_index, const uint16 data)
|
||||
{
|
||||
uint16 read_data = 0;
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((data & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
read_data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(data & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
read_data = ((read_data << 8) | SPI_DATA_RX(spi_index)); // 读取数据
|
||||
while(SPI_STATE_BUY(spi_index)){}; // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
|
||||
return read_data;
|
||||
}
|
||||
#endif
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口写 8bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_8bit(SPI_1, 0x11);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_8bit (spi_index_enum spi_index, const uint8 data)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, data); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_8bit_data_handler(spi_index, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口写 8bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_8bit_array(SPI_1, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_8bit_array (spi_index_enum spi_index, const uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, *data ++); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
spi_8bit_data_handler(spi_index, *data ++);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口写 16bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_16bit(SPI_1, 0x1101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_16bit (spi_index_enum spi_index, const uint16 data)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((data & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(data & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_16bit_data_handler(spi_index, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口写 16bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_16bit_array(SPI_1, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_16bit_array (spi_index_enum spi_index, const uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, (uint8)((*data & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(*data ++ & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
spi_16bit_data_handler(spi_index, *data ++);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口向传感器的寄存器写 8bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_8bit_register(SPI_1, 0x11, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_8bit_register (spi_index_enum spi_index, const uint8 register_name, const uint8 data)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, register_name); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, data); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_8bit_data_handler(spi_index, register_name);
|
||||
spi_8bit_data_handler(spi_index, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口向传感器的寄存器写 8bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_8bit_registers(SPI_1, 0x11, data, 32);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_8bit_registers (spi_index_enum spi_index, const uint8 register_name, const uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, register_name); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, *data ++); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_8bit_data_handler(spi_index, register_name);
|
||||
while(len --)
|
||||
{
|
||||
spi_8bit_data_handler(spi_index, *data ++);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口向传感器的寄存器写 16bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_16bit_register(SPI_1, 0x1011, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_16bit_register (spi_index_enum spi_index, const uint16 register_name, const uint16 data)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((register_name & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(register_name & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((data & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(data & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_16bit_data_handler(spi_index, register_name);
|
||||
spi_16bit_data_handler(spi_index, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口向传感器的寄存器写 16bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_write_16bit_registers(SPI_1, 0x1011, data, 32);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_write_16bit_registers (spi_index_enum spi_index, const uint16 register_name, const uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((register_name & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(register_name & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, (uint8)((*data & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(*data ++ & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_16bit_data_handler(spi_index, register_name);
|
||||
while(len--)
|
||||
{
|
||||
spi_16bit_data_handler(spi_index, *data++);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口读 8bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 返回参数 uint8 数据
|
||||
// 使用示例 spi_read_8bit(SPI_1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 spi_read_8bit (spi_index_enum spi_index)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
uint8 data = 0;
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
return data;
|
||||
#else
|
||||
return spi_8bit_data_handler(spi_index, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口读 8bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 发送缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_read_8bit_array(SPI_1, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_read_8bit_array (spi_index_enum spi_index, uint8 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
*data ++ = SPI_DATA_RX(spi_index); // 读取数据
|
||||
}
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = spi_8bit_data_handler(spi_index, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口读 16bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 返回参数 uint16 数据
|
||||
// 使用示例 spi_read_16bit(SPI_1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 spi_read_16bit (spi_index_enum spi_index)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
uint16 data = 0;
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
data = ((data << 8)| SPI_DATA_RX(spi_index)); // 读取数据
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
return data;
|
||||
#else
|
||||
return spi_16bit_data_handler(spi_index, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口读 16bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 发送缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_read_16bit_array(SPI_1, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_read_16bit_array (spi_index_enum spi_index, uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
*data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 接收到有效数据
|
||||
*data = ((*data << 8)| SPI_DATA_RX(spi_index)); // 读取数据
|
||||
data ++;
|
||||
}
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = spi_16bit_data_handler(spi_index, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口从传感器的寄存器读 8bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 返回参数 uint8 数据
|
||||
// 使用示例 spi_read_8bit_register(SPI_1, 0x11);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 spi_read_8bit_register (spi_index_enum spi_index, const uint8 register_name)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
uint8 data = 0;
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, register_name); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
return data;
|
||||
#else
|
||||
spi_8bit_data_handler(spi_index, register_name);
|
||||
return spi_8bit_data_handler(spi_index, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口从传感器的寄存器读 8bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 发送缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_read_8bit_registers(SPI_1, 0x11, data, 32);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_read_8bit_registers (spi_index_enum spi_index, const uint8 register_name, uint8 *data, uint32 len)
|
||||
{
|
||||
uint8 aaa =0 ,aaa1,aaa2,aaa3;
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, register_name); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*data ++ = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
|
||||
|
||||
}
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_8bit_data_handler(spi_index, register_name);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = spi_8bit_data_handler(spi_index, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口从传感器的寄存器读 16bit 数据
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 返回参数 uint16 数据
|
||||
// 使用示例 spi_read_16bit_register(SPI_1, 0x1011);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 spi_read_16bit_register (spi_index_enum spi_index, const uint16 register_name)
|
||||
{
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
uint16 data = 0;
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((register_name & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(register_name & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
data = ((data << 8)| SPI_DATA_RX(spi_index)); // 读取数据
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
return data;
|
||||
#else
|
||||
spi_16bit_data_handler(spi_index, register_name);
|
||||
return spi_16bit_data_handler(spi_index, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口从传感器的寄存器读 16bit 数组
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 发送缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_read_16bit_registers(SPI_1, 0x1101, data, 32);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_read_16bit_registers (spi_index_enum spi_index, const uint16 register_name, uint16 *data, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)((register_name & 0xFF00) >> 8)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (uint8)(register_name & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --)
|
||||
{
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*data = SPI_DATA_RX(spi_index); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, 0); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*data = ((*data << 8)| SPI_DATA_RX(spi_index)); // 读取数据
|
||||
data ++;
|
||||
}
|
||||
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
spi_16bit_data_handler(spi_index, register_name);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = spi_16bit_data_handler(spi_index, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 8bit 数据传输 发送与接收数据是同时进行的
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 write_buffer 发送的数据缓冲区地址
|
||||
// 参数说明 read_buffer 发送数据时接收到的数据的存储地址(不需要接收则传 NULL)
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_transfer_8bit(SPI_1, buf, buf, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_transfer_8bit (spi_index_enum spi_index, const uint8 *write_buffer, uint8 *read_buffer, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != write_buffer);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --) // 判断长度
|
||||
{
|
||||
SPI_DATA_TX(spi_index, *write_buffer ++); // 发送数据
|
||||
if(NULL != read_buffer) // 接收有效
|
||||
{
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*read_buffer ++ = SPI_DATA_RX(spi_index); // 读取数据
|
||||
}
|
||||
else
|
||||
{
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
}
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
if(NULL != read_buffer)
|
||||
{
|
||||
*read_buffer = spi_8bit_data_handler(spi_index, *write_buffer);
|
||||
write_buffer ++;
|
||||
read_buffer ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
spi_8bit_data_handler(spi_index, *write_buffer);
|
||||
write_buffer ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 16bit 数据传输 发送与接收数据是同时进行的
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 write_buffer 发送的数据缓冲区地址
|
||||
// 参数说明 read_buffer 发送数据时接收到的数据的存储地址(不需要接收则传 NULL)
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_transfer_16bit(SPI_1, buf, buf, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_transfer_16bit (spi_index_enum spi_index, const uint16 *write_buffer, uint16 *read_buffer, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != write_buffer);
|
||||
#ifdef SPI_SPEED_PRIORITY
|
||||
SPI_CTRL_RX(spi_index, ZF_ENABLE);
|
||||
SPI_CTRL_CS(spi_index, ZF_ENABLE);
|
||||
|
||||
while(len --) // 判断长度
|
||||
{
|
||||
if(NULL != read_buffer) // 接收有效
|
||||
{
|
||||
SPI_DATA_TX(spi_index, (*write_buffer & 0xFF00) >> 8); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*read_buffer = (SPI_DATA_RX(spi_index) & 0x00FF); // 读取数据
|
||||
|
||||
SPI_DATA_TX(spi_index, (*write_buffer & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_RX_AVAILABLE(spi_index)); // 等待读取一个数据
|
||||
*read_buffer = (*read_buffer << 8) | (SPI_DATA_RX(spi_index)& 0x00FF); // 读取数据
|
||||
|
||||
write_buffer ++;
|
||||
read_buffer ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
SPI_DATA_TX(spi_index, (*write_buffer & 0xFF00) >> 8); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
SPI_DATA_TX(spi_index, (*write_buffer & 0x00FF)); // 发送数据
|
||||
while(!SPI_STATE_TX_EMPTY(spi_index)); // 发送为空
|
||||
|
||||
write_buffer ++;
|
||||
}
|
||||
}
|
||||
|
||||
while(SPI_STATE_BUY(spi_index)); // 等待传输完毕
|
||||
SPI_CTRL_CS(spi_index, ZF_DISABLE);
|
||||
SPI_CTRL_RX(spi_index, ZF_DISABLE);
|
||||
#else
|
||||
while(len --)
|
||||
{
|
||||
if(NULL != read_buffer)
|
||||
{
|
||||
*read_buffer = spi_16bit_data_handler(spi_index, *write_buffer);
|
||||
write_buffer ++;
|
||||
read_buffer ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
spi_16bit_data_handler(spi_index, *write_buffer);
|
||||
write_buffer ++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 SPI 接口初始化
|
||||
// 参数说明 spi_index SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
|
||||
// 参数说明 mode SPI 模式 参照 zf_driver_spi.h 内 spi_mode_enum 枚举体定义
|
||||
// 参数说明 baud 设置 SPI 的波特率 不超过系统时钟的一半 部分速率会被适配成相近的速率
|
||||
// 参数说明 sck_pin 选择 SCK 引脚 参照 zf_driver_spi.h 内 spi_sck_pin_enum 枚举体定义
|
||||
// 参数说明 mosi_pin 选择 MOSI 引脚 参照 zf_driver_spi.h 内 spi_mosi_pin_enum 枚举体定义
|
||||
// 参数说明 miso_pin 选择 MISO 引脚 参照 zf_driver_spi.h 内 spi_miso_pin_enum 枚举体定义
|
||||
// 参数说明 cs_pin 选择 CS 引脚 参照 zf_driver_spi.h 内 spi_cs_pin_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_init(SPI_1, 0, 1*1000*1000, SPI1_SCK_A05, SPI1_MOSI_A07, SPI1_MISO_A06, SPI1_NSS_A04);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void spi_init (spi_index_enum spi_index, spi_mode_enum mode, uint32 baud, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin)
|
||||
{
|
||||
zf_assert(((sck_pin >> SPI_INDEX_OFFSET) & SPI_INDEX_MASK) == spi_index);
|
||||
zf_assert(((mosi_pin >> SPI_INDEX_OFFSET) & SPI_INDEX_MASK) == spi_index);
|
||||
zf_assert((((miso_pin >> SPI_INDEX_OFFSET) & SPI_INDEX_MASK) == spi_index) || (SPI_MISO_NULL == miso_pin));
|
||||
zf_assert((((cs_pin >> SPI_INDEX_OFFSET) & SPI_INDEX_MASK) == spi_index) || (SPI_CS_NULL == cs_pin));
|
||||
|
||||
afio_init(
|
||||
(gpio_pin_enum)(sck_pin & SPI_PIN_INDEX_MASK),
|
||||
GPO,
|
||||
(gpio_af_enum)((sck_pin >> SPI_PIN_AF_OFFSET) & SPI_PIN_AF_MASK),
|
||||
GPO_PUSH_PULL);
|
||||
afio_init(
|
||||
(gpio_pin_enum)(mosi_pin & SPI_PIN_INDEX_MASK),
|
||||
GPO,
|
||||
(gpio_af_enum)((mosi_pin >> SPI_PIN_AF_OFFSET) & SPI_PIN_AF_MASK),
|
||||
GPO_AF_PUSH_PULL);
|
||||
if(SPI_MISO_NULL != miso_pin)
|
||||
{
|
||||
afio_init(
|
||||
(gpio_pin_enum)(miso_pin &SPI_PIN_INDEX_MASK),
|
||||
GPI,
|
||||
(gpio_af_enum)((miso_pin >> SPI_PIN_AF_OFFSET) & SPI_PIN_AF_MASK),
|
||||
GPI_FLOATING_IN);
|
||||
}
|
||||
if(SPI_CS_NULL != cs_pin)
|
||||
{
|
||||
afio_init(
|
||||
(gpio_pin_enum)(cs_pin &SPI_PIN_INDEX_MASK),
|
||||
GPO,
|
||||
(gpio_af_enum)((cs_pin >> SPI_PIN_AF_OFFSET) & SPI_PIN_AF_MASK),
|
||||
GPO_AF_PUSH_PULL);
|
||||
}
|
||||
|
||||
DL_SPI_Config spi_default_config =
|
||||
{
|
||||
.mode = DL_SPI_MODE_CONTROLLER,
|
||||
.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0,
|
||||
.parity = DL_SPI_PARITY_NONE,
|
||||
.dataSize = DL_SPI_DATA_SIZE_8,
|
||||
.bitOrder = DL_SPI_BIT_ORDER_MSB_FIRST,
|
||||
.chipSelectPin = DL_SPI_CHIP_SELECT_0,
|
||||
};
|
||||
DL_SPI_ClockConfig spi_default_clock_config =
|
||||
{
|
||||
.clockSel = DL_SPI_CLOCK_BUSCLK,
|
||||
.divideRatio = DL_SPI_CLOCK_DIVIDE_RATIO_1
|
||||
};
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case SPI_MODE0: spi_default_config.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0; break;
|
||||
case SPI_MODE1: spi_default_config.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA1; break;
|
||||
case SPI_MODE2: spi_default_config.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA0; break;
|
||||
case SPI_MODE3: spi_default_config.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA1; break;
|
||||
}
|
||||
DL_SPI_setClockConfig(spi_list[spi_index], (DL_SPI_ClockConfig *)&spi_default_clock_config);
|
||||
DL_SPI_init(spi_list[spi_index], (DL_SPI_Config *)&spi_default_config);
|
||||
|
||||
uint16 div = 0;
|
||||
uint32 clock_selcet = 80 * 1000 * 1000;
|
||||
uint32 baud_large = clock_selcet / ((div + 1) * 2);
|
||||
uint32 baud_temp = clock_selcet / ((div + 1) * 2);
|
||||
for(div = 0; 0x3FF > div; div ++)
|
||||
{
|
||||
baud_temp = clock_selcet / ((div + 1) * 2);
|
||||
if(baud_temp <= baud)
|
||||
{
|
||||
break;
|
||||
}
|
||||
baud_large = baud_temp;
|
||||
}
|
||||
DL_SPI_setBitRateSerialClockDivider(spi_list[spi_index], div);
|
||||
DL_SPI_setFIFOThreshold(spi_list[spi_index], DL_SPI_RX_FIFO_LEVEL_1_4_FULL, DL_SPI_TX_FIFO_LEVEL_EMPTY);
|
||||
DL_SPI_enable(spi_list[spi_index]);
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_spi
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_spi_h_
|
||||
#define _zf_driver_spi_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
//#define SPI_SPEED_PRIORITY // SPI 通信速度优先
|
||||
|
||||
#define SPI_NUM ( 2 )
|
||||
|
||||
typedef enum // 枚举 SPI 编号 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI_0,
|
||||
SPI_1,
|
||||
}spi_index_enum;
|
||||
|
||||
typedef enum // 枚举 SPI 模式 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI_MODE0,
|
||||
SPI_MODE1,
|
||||
SPI_MODE2,
|
||||
SPI_MODE3,
|
||||
}spi_mode_enum;
|
||||
|
||||
// 定义引脚要用的宏定义 根据各单片机不同 可以自由定义需要什么信息
|
||||
// bit[11:0 ] 固定为引脚索引
|
||||
// bit[15:12] 固定为引脚复用
|
||||
// bit[19:16] 在 SPI 模块中为 SPI 索引
|
||||
|
||||
#define SPI_PIN_INDEX_OFFSET ( 0 ) // bit[11:0 ] 存储 GPIO 的索引号
|
||||
#define SPI_PIN_INDEX_MASK ( 0x0FFF ) // 宽度 12bit 因此掩码为 0x0FFF
|
||||
|
||||
#define SPI_PIN_AF_OFFSET ( 12 ) // bit[15:12] 存储 GPIO 的复用功能索引
|
||||
#define SPI_PIN_AF_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
#define SPI_INDEX_OFFSET ( 16 ) // bit[19:16] 存储 SPI 索引
|
||||
#define SPI_INDEX_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
typedef enum // 枚举 SPI SCK 引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
// SPI0 引脚 SCK
|
||||
SPI0_SCK_A6 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A6 )),
|
||||
SPI0_SCK_A11 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A11)),
|
||||
SPI0_SCK_A12 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A12)),
|
||||
SPI0_SCK_B18 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B18)),
|
||||
|
||||
// SPI1 引脚 SCK
|
||||
SPI1_SCK_A17 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A17)),
|
||||
SPI1_SCK_B9 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B9 )),
|
||||
SPI1_SCK_B16 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B16)),
|
||||
SPI1_SCK_B23 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF2 << SPI_PIN_AF_OFFSET) | (B23)),
|
||||
}spi_sck_pin_enum;
|
||||
|
||||
typedef enum // 枚举 SPI MOSI 引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
// SPI1 引脚 MOSI
|
||||
SPI0_MOSI_A5 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A5 )),
|
||||
SPI0_MOSI_A9 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A9 )),
|
||||
SPI0_MOSI_A14 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A14)),
|
||||
SPI0_MOSI_B17 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B17)),
|
||||
|
||||
// SPI2 引脚 MOSI
|
||||
SPI1_MOSI_A18 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A18)),
|
||||
SPI1_MOSI_B8 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B8 )),
|
||||
SPI1_MOSI_B15 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B15)),
|
||||
SPI1_MOSI_B22 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF2 << SPI_PIN_AF_OFFSET) | (B22)),
|
||||
}spi_mosi_pin_enum;
|
||||
|
||||
typedef enum // 枚举 SPI MISO 引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI_MISO_NULL = 0xFFFFF, // 不使用硬件 MISO 引脚就填这个
|
||||
|
||||
// SPI1 引脚 MISO
|
||||
SPI0_MISO_A4 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A4 )),
|
||||
SPI0_MISO_A10 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A10)),
|
||||
SPI0_MISO_A13 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A13)),
|
||||
SPI0_MISO_B19 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B19)),
|
||||
|
||||
// SPI2 引脚 MISO
|
||||
SPI1_MISO_A16 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A16)),
|
||||
SPI1_MISO_B7 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B7 )),
|
||||
SPI1_MISO_B14 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B14)),
|
||||
SPI1_MISO_B21 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF2 << SPI_PIN_AF_OFFSET) | (B21)),
|
||||
}spi_miso_pin_enum;
|
||||
|
||||
typedef enum // 枚举 SPI CS 引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI_CS_NULL = 0xFFFFF, // 不使用硬件 CS 引脚就填这个
|
||||
|
||||
// SPI1 引脚 CS
|
||||
SPI0_CS_A2 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A2 )),
|
||||
SPI0_CS_A8 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A8 )),
|
||||
SPI0_CS_B25 = ((SPI_0 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B25)),
|
||||
|
||||
// SPI2 引脚 CS
|
||||
SPI1_CS_A2 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF5 << SPI_PIN_AF_OFFSET) | (A2 )),
|
||||
SPI1_CS_A26 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (A26)),
|
||||
SPI1_CS_B6 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B6 )),
|
||||
SPI1_CS_B20 = ((SPI_1 << SPI_INDEX_OFFSET) | (GPIO_AF3 << SPI_PIN_AF_OFFSET) | (B20)),
|
||||
}spi_cs_pin_enum;
|
||||
|
||||
void spi_write_8bit (spi_index_enum spi_index, const uint8 data);
|
||||
void spi_write_8bit_array (spi_index_enum spi_index, const uint8 *data, uint32 len);
|
||||
|
||||
void spi_write_16bit (spi_index_enum spi_index, const uint16 data);
|
||||
void spi_write_16bit_array (spi_index_enum spi_index, const uint16 *data, uint32 len);
|
||||
|
||||
void spi_write_8bit_register (spi_index_enum spi_index, const uint8 register_name, const uint8 data);
|
||||
void spi_write_8bit_registers (spi_index_enum spi_index, const uint8 register_name, const uint8 *data, uint32 len);
|
||||
|
||||
void spi_write_16bit_register (spi_index_enum spi_index, const uint16 register_name, const uint16 data);
|
||||
void spi_write_16bit_registers (spi_index_enum spi_index, const uint16 register_name, const uint16 *data, uint32 len);
|
||||
|
||||
uint8 spi_read_8bit (spi_index_enum spi_index);
|
||||
void spi_read_8bit_array (spi_index_enum spi_index, uint8 *data, uint32 len);
|
||||
|
||||
uint16 spi_read_16bit (spi_index_enum spi_index);
|
||||
void spi_read_16bit_array (spi_index_enum spi_index, uint16 *data, uint32 len);
|
||||
|
||||
uint8 spi_read_8bit_register (spi_index_enum spi_index, const uint8 register_name);
|
||||
void spi_read_8bit_registers (spi_index_enum spi_index, const uint8 register_name, uint8 *data, uint32 len);
|
||||
|
||||
uint16 spi_read_16bit_register (spi_index_enum spi_index, const uint16 register_name);
|
||||
void spi_read_16bit_registers (spi_index_enum spi_index, const uint16 register_name, uint16 *data, uint32 len);
|
||||
|
||||
void spi_transfer_8bit (spi_index_enum spi_index, const uint8 *write_buffer, uint8 *read_buffer, uint32 len);
|
||||
void spi_transfer_16bit (spi_index_enum spi_index, const uint16 *write_buffer, uint16 *read_buffer, uint32 len);
|
||||
|
||||
void spi_init (spi_index_enum spi_index, spi_mode_enum mode, uint32 baud, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,275 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_timer
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
#include "zf_driver_timer.h"
|
||||
|
||||
timer_function_enum timer_function_state[TIM_NUM] =
|
||||
{
|
||||
TIMER_FUNCTION_INIT, TIMER_FUNCTION_INIT,
|
||||
TIMER_FUNCTION_INIT, TIMER_FUNCTION_INIT,
|
||||
TIMER_FUNCTION_INIT, TIMER_FUNCTION_INIT,
|
||||
TIMER_FUNCTION_INIT
|
||||
};
|
||||
|
||||
static timer_mode_enum timer_mode_state[TIM_NUM] =
|
||||
{
|
||||
TIMER_SYSTEM_CLOCK, TIMER_SYSTEM_CLOCK,
|
||||
TIMER_SYSTEM_CLOCK, TIMER_SYSTEM_CLOCK,
|
||||
TIMER_SYSTEM_CLOCK, TIMER_SYSTEM_CLOCK,
|
||||
TIMER_SYSTEM_CLOCK
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 外设确认功能状态 库内部调用
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 参数说明 mode 需要确的功能模块
|
||||
// 返回参数 uint8 1-可以使用 0-不可以使用
|
||||
// 使用示例 zf_assert(timer_funciton_check(index, mode);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 timer_funciton_check (timer_index_enum index,timer_function_enum mode)
|
||||
{
|
||||
uint8 return_state = 1;
|
||||
if(TIMER_FUNCTION_INIT == timer_function_state[index])
|
||||
{
|
||||
timer_function_state[index] = mode;
|
||||
}
|
||||
else if(timer_function_state[index] == mode)
|
||||
{
|
||||
return_state = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return_state = 0;
|
||||
}
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 时钟使能 库内部调用
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_clock_enable(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_clock_enable (timer_index_enum index)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : TIMA0 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_A1 : TIMA1 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_G0 : TIMG0 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_G6 : TIMG6 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_G7 : TIMG7 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_G8 : TIMG8 ->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
case TIM_G12: TIMG12->COMMONREGS.CCLKCTL |= GPTIMER_CCLKCTL_CLKEN_ENABLED; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 开始计时
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_start(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_start (timer_index_enum index)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : TIMA0 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_A1 : TIMA1 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_G0 : TIMG0 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_G6 : TIMG6 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_G7 : TIMG7 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_G8 : TIMG8 ->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
case TIM_G12: TIMG12->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 停止计时
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_stop(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_stop (timer_index_enum index)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : TIMA0 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_A1 : TIMA1 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_G0 : TIMG0 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_G6 : TIMG6 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_G7 : TIMG7 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_G8 : TIMG8 ->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
case TIM_G12: TIMG12->COUNTERREGS.CTRCTL &= ~GPTIMER_CTRCTL_EN_MASK; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 获取计时器计数
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 uint16 计数值
|
||||
// 使用示例 timer_get(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 timer_get (timer_index_enum index)
|
||||
{
|
||||
uint16 return_value = 0;
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : return_value = TIMA0 ->COUNTERREGS.CTR; break;
|
||||
case TIM_A1 : return_value = TIMA1 ->COUNTERREGS.CTR; break;
|
||||
case TIM_G0 : return_value = TIMG0 ->COUNTERREGS.CTR; break;
|
||||
case TIM_G6 : return_value = TIMG6 ->COUNTERREGS.CTR; break;
|
||||
case TIM_G7 : return_value = TIMG7 ->COUNTERREGS.CTR; break;
|
||||
case TIM_G8 : return_value = TIMG8 ->COUNTERREGS.CTR; break;
|
||||
case TIM_G12: return_value = TIMG12->COUNTERREGS.CTR; break;
|
||||
default: break;
|
||||
}
|
||||
if(TIMER_MS == timer_mode_state[index])
|
||||
{
|
||||
return_value = return_value / 2;
|
||||
}
|
||||
if(TIM_G12 == index)
|
||||
{
|
||||
return_value = (uint16)(return_value / 250);
|
||||
}
|
||||
return return_value;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 清除计时器计数
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_clear(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_clear (timer_index_enum index)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : TIMA0 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_A1 : TIMA1 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_G0 : TIMG0 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_G6 : TIMG6 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_G7 : TIMG7 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_G8 : TIMG8 ->COUNTERREGS.CTR = 0; break;
|
||||
case TIM_G12: TIMG12->COUNTERREGS.CTR = 0; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 计时器初始化
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 参数说明 mode 计时方式
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_init(index, mode);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_init (timer_index_enum index, timer_mode_enum mode)
|
||||
{
|
||||
// 如果程序在输出了断言信息 并且提示出错位置在这里
|
||||
// 就去查看你在什么地方调用这个函数 检查你的传入参数
|
||||
// 这里是检查是否有重复使用定时器
|
||||
// 比如初始化了 TIM1_PWM 然后又初始化成 TIM_1 这种用法是不允许的
|
||||
zf_assert(timer_funciton_check(index, TIMER_FUNCTION_TIMER));
|
||||
|
||||
GPTIMER_Regs *timer_obj;
|
||||
switch(index)
|
||||
{
|
||||
case TIM_A0 : timer_obj = TIMA0 ; break;
|
||||
case TIM_A1 : timer_obj = TIMA1 ; break;
|
||||
case TIM_G0 : timer_obj = TIMG0 ; break;
|
||||
case TIM_G6 : timer_obj = TIMG6 ; break;
|
||||
case TIM_G7 : timer_obj = TIMG7 ; break;
|
||||
case TIM_G8 : timer_obj = TIMG8 ; break;
|
||||
case TIM_G12: timer_obj = TIMG12; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
timer_obj->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CM_UP;
|
||||
switch(mode)
|
||||
{
|
||||
case TIMER_US:
|
||||
{
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_MFCLK_SEL_ENABLE;
|
||||
timer_obj->CLKDIV = 3;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
// 4 * 1000 * 1000 / 4 / 1 == 1 MHz
|
||||
timer_obj->COUNTERREGS.LOAD = 0xFFFF;
|
||||
timer_mode_state[index] = TIMER_US;
|
||||
}break;
|
||||
case TIMER_MS:
|
||||
{
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_MFCLK_SEL_ENABLE;
|
||||
timer_obj->CLKDIV = 7;
|
||||
timer_obj->COMMONREGS.CPS = 249;
|
||||
// 4 * 1000 * 1000 / 8 / 250 == 2 KHz
|
||||
timer_obj->COUNTERREGS.LOAD = 0xFFFF;
|
||||
timer_mode_state[index] = TIMER_MS;
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
timer_obj->CLKSEL = GPTIMER_CLKSEL_BUSCLK_SEL_ENABLE;
|
||||
if(TIM_G0 == index || TIM_G8 == index)
|
||||
{
|
||||
timer_obj->CLKDIV = 0;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
timer_obj->CLKDIV = 1;
|
||||
timer_obj->COMMONREGS.CPS = 0;
|
||||
}
|
||||
// 40 * 1000 * 1000 == 40 MHz
|
||||
timer_obj->COUNTERREGS.LOAD = 0xFFFF;
|
||||
timer_mode_state[index] = TIMER_SYSTEM_CLOCK;
|
||||
}break;
|
||||
}
|
||||
|
||||
timer_stop(index);
|
||||
timer_clear(index);
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_timer
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_timer_h_
|
||||
#define _zf_driver_timer_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIM_A0 ,
|
||||
TIM_A1 ,
|
||||
TIM_G0 ,
|
||||
TIM_G6 ,
|
||||
TIM_G7 ,
|
||||
TIM_G8 ,
|
||||
TIM_G12 ,
|
||||
}timer_index_enum;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIMER_SYSTEM_CLOCK, // 系统频率计时 最大 0xFFFF
|
||||
TIMER_US, // 微秒计时 最大 0xFFFF
|
||||
TIMER_MS, // 毫秒计时 最大 0xFFFF/2
|
||||
}timer_mode_enum;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIMER_FUNCTION_INIT = 0, // 功能未初始化
|
||||
TIMER_FUNCTION_TIMER, // 用作 TIMER 计时
|
||||
TIMER_FUNCTION_PIT, // 用作 PIT
|
||||
TIMER_FUNCTION_PWM, // 用作 PWM
|
||||
}timer_function_enum;
|
||||
|
||||
#define TIM_NUM ( 7 )
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 外设确认功能状态 库内部调用
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 参数说明 mode 需要确的功能模块
|
||||
// 返回参数 uint8 1-可以使用 0-不可以使用
|
||||
// 使用示例 zf_assert(timer_funciton_check(index, mode);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 timer_funciton_check (timer_index_enum index,timer_function_enum mode);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 时钟使能 库内部调用
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_clock_enable(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_clock_enable (timer_index_enum index);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 开始计时
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_start(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_start (timer_index_enum index);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 停止计时
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_stop(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_stop (timer_index_enum index);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 获取计时器计数
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 uint16 计数值
|
||||
// 使用示例 timer_get(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 timer_get (timer_index_enum index);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 清除计时器计数
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_clear(index);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_clear (timer_index_enum index);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 TIMER 计时器初始化
|
||||
// 参数说明 index TIMER 外设模块号
|
||||
// 参数说明 mode 计时方式
|
||||
// 返回参数 void
|
||||
// 使用示例 timer_init(index, mode);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void timer_init (timer_index_enum index, timer_mode_enum mode);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,305 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_uart
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_clock.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_common_interrupt.h"
|
||||
|
||||
#include "zf_driver_uart.h"
|
||||
|
||||
static UART_Regs *uart_list[UART_NUM] = {UART0, UART1, UART2, UART3};
|
||||
static IRQn_Type uart_irq[UART_NUM] = {UART0_INT_IRQn, UART1_INT_IRQn, UART2_INT_IRQn, UART3_INT_IRQn};
|
||||
static uint8 uart_interrupt_state[UART_NUM] = {0, 0, 0, 0};
|
||||
|
||||
static void uart_callbakc_defalut (uint32 event, void *ptr);
|
||||
void *uart_callback_ptr_list[UART_NUM] = {NULL, NULL, NULL, NULL};
|
||||
void_callback_uint32_ptr uart_callback_list[UART_NUM] = {uart_callbakc_defalut, uart_callbakc_defalut, uart_callbakc_defalut, uart_callbakc_defalut};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 中断默认回调函数
|
||||
// 参数说明 event 触发中断的事件 此处默认为 0
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void uart_callbakc_defalut (uint32 event, void *ptr)
|
||||
{
|
||||
(void)event;
|
||||
(void)ptr;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 字节输出
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 dat 需要发送的字节
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_byte (uart_index_enum uart_index, const uint8 dat)
|
||||
{
|
||||
while(true == DL_UART_isBusy(uart_list[uart_index]));
|
||||
DL_UART_Main_transmitData(uart_list[uart_index], dat); // 写入发送数据
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 发送数组
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *buff 要发送的数组地址
|
||||
// 参数说明 len 发送长度
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_buffer(uart_index, buff, len);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_buffer (uart_index_enum uart_index, const uint8 *buff, uint32 len)
|
||||
{
|
||||
zf_assert(NULL != buff);
|
||||
while(len) // 循环到发送完
|
||||
{
|
||||
while(true == DL_UART_isBusy(uart_list[uart_index]));
|
||||
DL_UART_Main_transmitData(uart_list[uart_index], *buff ++); // 写入发送数据
|
||||
len --;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 发送字符串
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *str 要发送的字符串地址
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_string(uart_index, str);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_string (uart_index_enum uart_index, const char *str)
|
||||
{
|
||||
zf_assert(NULL != str);
|
||||
while(*str) // 一直循环到结尾
|
||||
{
|
||||
while(true == DL_UART_isBusy(uart_list[uart_index]));
|
||||
DL_UART_Main_transmitData(uart_list[uart_index], *str ++); // 写入发送数据
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 读取接收的数据(阻塞式 whlie 等待 会超时退出)
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 返回参数 uint8 ZF_TRUE - 接收成功 ZF_FALSE - 未接收到数据
|
||||
// 使用示例 uart_read_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_read_byte (uart_index_enum uart_index, uint8 *data)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
|
||||
uint8 return_state = ZF_FALSE;
|
||||
vuint32 timeout_count = UART_DEFAULT_TIMEOUT_COUNT;
|
||||
|
||||
while(timeout_count)
|
||||
{
|
||||
if(false == DL_UART_isRXFIFOEmpty(uart_list[uart_index]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
timeout_count --;
|
||||
}
|
||||
if(timeout_count)
|
||||
{
|
||||
*data = DL_UART_Main_receiveData(uart_list[uart_index]);
|
||||
return_state = ZF_TRUE;
|
||||
}
|
||||
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 读取接收的数据(查询接收)
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 返回参数 uint8 ZF_TRUE - 接收成功 ZF_FALSE - 未接收到数据
|
||||
// 使用示例 uart_query_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_query_byte (uart_index_enum uart_index, uint8 *data)
|
||||
{
|
||||
zf_assert(NULL != data);
|
||||
|
||||
uint8 return_state = ZF_FALSE;
|
||||
|
||||
if(false == DL_UART_isRXFIFOEmpty(uart_list[uart_index])) // 读取到一个数据
|
||||
{
|
||||
*data = DL_UART_Main_receiveData(uart_list[uart_index]); // 存储一个数据
|
||||
return_state = ZF_TRUE;
|
||||
}
|
||||
|
||||
return return_state;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 中断回调函数
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_callback(uart_index, callback, ptr);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_callback (uart_index_enum uart_index, void_callback_uint32_ptr callback, void *ptr)
|
||||
{
|
||||
uart_callback_ptr_list[uart_index] = ptr;
|
||||
uart_callback_list[uart_index] = (NULL == callback) ? (uart_callbakc_defalut) : (callback);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 中断设置
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 config 中断配置 (详见 zf_driver_uart.h 内 uart_interrupt_config_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_interrupt_config(uart_index, config);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_interrupt_config (uart_index_enum uart_index, uart_interrupt_config_enum config)
|
||||
{
|
||||
switch(config)
|
||||
{
|
||||
case UART_INTERRUPT_CONFIG_TX_DISABLE:
|
||||
{
|
||||
DL_UART_Main_disableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_TX);
|
||||
uart_interrupt_state[uart_index] &= 0xEF;
|
||||
if(0x00 == uart_interrupt_state[uart_index])
|
||||
{
|
||||
interrupt_disable(uart_irq[uart_index]);
|
||||
}
|
||||
}break;
|
||||
case UART_INTERRUPT_CONFIG_RX_DISABLE:
|
||||
{
|
||||
DL_UART_Main_disableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_RX);
|
||||
uart_interrupt_state[uart_index] &= 0xFE;
|
||||
if(0x00 == uart_interrupt_state[uart_index])
|
||||
{
|
||||
interrupt_disable(uart_irq[uart_index]);
|
||||
}
|
||||
}break;
|
||||
case UART_INTERRUPT_CONFIG_ALL_DISABLE:
|
||||
{
|
||||
DL_UART_Main_disableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_TX);
|
||||
DL_UART_Main_disableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_RX);
|
||||
interrupt_disable(uart_irq[uart_index]);
|
||||
}break;
|
||||
case UART_INTERRUPT_CONFIG_TX_ENABLE:
|
||||
{
|
||||
DL_UART_Main_enableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_TX);
|
||||
uart_interrupt_state[uart_index] |= 0x10;
|
||||
interrupt_enable(uart_irq[uart_index]);
|
||||
}break;
|
||||
case UART_INTERRUPT_CONFIG_RX_ENABLE:
|
||||
{
|
||||
DL_UART_Main_enableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_RX);
|
||||
uart_interrupt_state[uart_index] |= 0x01;
|
||||
interrupt_enable(uart_irq[uart_index]);
|
||||
}break;
|
||||
case UART_INTERRUPT_CONFIG_ALL_ENABLE:
|
||||
{
|
||||
DL_UART_Main_enableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_TX);
|
||||
DL_UART_Main_enableInterrupt(uart_list[uart_index], DL_UART_MAIN_INTERRUPT_RX);
|
||||
interrupt_enable(uart_irq[uart_index]);
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 初始化
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 baud UART 波特率
|
||||
// 参数说明 tx_pin UART 发送引脚 (详见 zf_driver_uart.h 内 uart_tx_pin_enum 定义)
|
||||
// 参数说明 rx_pin UART 接收引脚 (详见 zf_driver_uart.h 内 uart_rx_pin_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_init(uart_index, baudrate, tx_pin, rx_pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_init (uart_index_enum uart_index, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin)
|
||||
{
|
||||
static const DL_UART_Main_ClockConfig uart_clock_config =
|
||||
{
|
||||
.clockSel = DL_UART_MAIN_CLOCK_BUSCLK,
|
||||
.divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
|
||||
};
|
||||
|
||||
static const DL_UART_Main_Config uart_default_config =
|
||||
{
|
||||
.mode = DL_UART_MAIN_MODE_NORMAL,
|
||||
.direction = DL_UART_MAIN_DIRECTION_TX_RX,
|
||||
.flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
|
||||
.parity = DL_UART_MAIN_PARITY_NONE,
|
||||
.wordLength = DL_UART_MAIN_WORD_LENGTH_8_BITS,
|
||||
.stopBits = DL_UART_MAIN_STOP_BITS_ONE
|
||||
};
|
||||
|
||||
afio_init
|
||||
(
|
||||
(gpio_pin_enum)(tx_pin & UART_PIN_INDEX_MASK),
|
||||
GPO,
|
||||
(gpio_af_enum)((tx_pin >> UART_PIN_AF_OFFSET) & UART_PIN_AF_MASK),
|
||||
GPO_AF_PUSH_PULL
|
||||
);
|
||||
afio_init
|
||||
(
|
||||
(gpio_pin_enum)(rx_pin & UART_PIN_INDEX_MASK),
|
||||
GPI,
|
||||
(gpio_af_enum)((rx_pin >> UART_PIN_AF_OFFSET) & UART_PIN_AF_MASK),
|
||||
GPI_PULL_UP
|
||||
);
|
||||
|
||||
switch(uart_index)
|
||||
{
|
||||
case UART_0: DL_UART_Main_setClockConfig(uart_list[uart_index], (DL_UART_Main_ClockConfig *) &uart_clock_config); break;
|
||||
case UART_1: DL_UART_Main_setClockConfig(uart_list[uart_index], (DL_UART_Main_ClockConfig *) &uart_clock_config); break;
|
||||
case UART_2: DL_UART_Main_setClockConfig(uart_list[uart_index], (DL_UART_Main_ClockConfig *) &uart_clock_config); break;
|
||||
case UART_3: DL_UART_Main_setClockConfig(uart_list[uart_index], (DL_UART_Main_ClockConfig *) &uart_clock_config); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
DL_UART_Main_init(uart_list[uart_index], (DL_UART_Main_Config *) &uart_default_config);
|
||||
DL_UART_Main_setOversampling(uart_list[uart_index], DL_UART_OVERSAMPLING_RATE_8X);
|
||||
|
||||
double buadrate_double = ((UART_3 == uart_index) ? (80000000.0) : (40000000.0)) / (double)baud / 8.0;
|
||||
uint16 buadrate_integer = (uint16)buadrate_double;
|
||||
uint16 buadrate_fractional = (uint16)((buadrate_double - buadrate_integer) * 64.0 + 0.5);
|
||||
|
||||
DL_UART_Main_setBaudRateDivisor(uart_list[uart_index], buadrate_integer, buadrate_fractional);
|
||||
|
||||
DL_UART_Main_enable(uart_list[uart_index]);
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
/*********************************************************************************************************************
|
||||
* MSPM0G3507 Opensource Library 即(MSPM0G3507 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 MSPM0G3507 开源库的一部分
|
||||
*
|
||||
* MSPM0G3507 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_uart
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 MDK 5.37
|
||||
* 适用平台 MSPM0G3507
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2025-06-1 SeekFree first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_uart_h_
|
||||
#define _zf_driver_uart_h_
|
||||
|
||||
#include "ti_msp_dl_config.h"
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
#define UART_NUM ( 4 )
|
||||
|
||||
typedef enum // 枚举串口号 此枚举定义不允许用户修改
|
||||
{
|
||||
UART_0,
|
||||
UART_1,
|
||||
UART_2,
|
||||
UART_3,
|
||||
}uart_index_enum;
|
||||
|
||||
// 定义引脚要用的宏定义 根据各单片机不同 可以自由定义需要什么信息
|
||||
// bit[11:0 ] 固定为引脚索引
|
||||
// bit[15:12] 固定为引脚复用
|
||||
// bit[19:16] 在 UART 模块中为 UART 索引
|
||||
|
||||
#define UART_PIN_INDEX_OFFSET ( 0 ) // bit[11:0 ] 存储 GPIO 的索引号
|
||||
#define UART_PIN_INDEX_MASK ( 0x0FFF ) // 宽度 12bit 因此掩码为 0x0FFF
|
||||
|
||||
#define UART_PIN_AF_OFFSET ( 12 ) // bit[15:12] 存储 GPIO 的复用功能索引
|
||||
#define UART_PIN_AF_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
#define UART_INDEX_OFFSET ( 16 ) // bit[19:16] 存储 UART 索引
|
||||
#define UART_INDEX_MASK ( 0x0F ) // 宽度 4bit 因此掩码为 0x0F
|
||||
|
||||
typedef enum // 枚举串口引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
// UART 0 TX 引脚
|
||||
UART0_TX_A0 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A0 )),
|
||||
UART0_TX_A10 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A10)),
|
||||
UART0_TX_A28 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A28)),
|
||||
UART0_TX_B0 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B0 )),
|
||||
|
||||
// UART 1 TX 引脚
|
||||
UART1_TX_A8 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A8 )),
|
||||
UART1_TX_A17 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A17)),
|
||||
UART1_TX_B4 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B4 )),
|
||||
UART1_TX_B6 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B6 )),
|
||||
|
||||
// UART 2 TX 引脚
|
||||
UART2_TX_A21 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A21)),
|
||||
UART2_TX_A23 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A23)),
|
||||
UART2_TX_B15 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B15)),
|
||||
UART2_TX_B17 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B17)),
|
||||
|
||||
// UART 3 TX 引脚
|
||||
UART3_TX_A14 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF4 << UART_PIN_AF_OFFSET) | (A14)),
|
||||
UART3_TX_A26 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A26)),
|
||||
UART3_TX_B2 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B2 )),
|
||||
UART3_TX_B12 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B12)),
|
||||
}uart_tx_pin_enum;
|
||||
|
||||
typedef enum // 枚举串口引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
// UART 0 RX 引脚
|
||||
UART0_RX_A1 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A1 )),
|
||||
UART0_RX_A11 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A11)),
|
||||
UART0_RX_A31 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A31)),
|
||||
UART0_RX_B1 = ((UART_0 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B1 )),
|
||||
|
||||
// UART 1 RX 引脚
|
||||
UART1_RX_A9 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A9 )),
|
||||
UART1_RX_A18 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A18)),
|
||||
UART1_RX_B5 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B5 )),
|
||||
UART1_RX_B7 = ((UART_1 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B7 )),
|
||||
|
||||
// UART 2 RX 引脚
|
||||
UART2_RX_A22 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A22)),
|
||||
UART2_RX_A24 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A24)),
|
||||
UART2_RX_B16 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B16)),
|
||||
UART2_RX_B18 = ((UART_2 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B18)),
|
||||
|
||||
// UART 3 RX 引脚
|
||||
UART3_RX_A13 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF4 << UART_PIN_AF_OFFSET) | (A13)),
|
||||
UART3_RX_A25 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (A25)),
|
||||
UART3_RX_B3 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B3 )),
|
||||
UART3_RX_B13 = ((UART_3 << UART_INDEX_OFFSET) | (GPIO_AF2 << UART_PIN_AF_OFFSET) | (B13)),
|
||||
}uart_rx_pin_enum;
|
||||
|
||||
typedef enum // 枚举 UART 中断配置 此枚举定义不允许用户修改
|
||||
{
|
||||
UART_INTERRUPT_CONFIG_TX_DISABLE , // 禁止 发送中断
|
||||
UART_INTERRUPT_CONFIG_RX_DISABLE , // 禁止 接收中断
|
||||
UART_INTERRUPT_CONFIG_ALL_DISABLE , // 禁止 所有中断
|
||||
|
||||
UART_INTERRUPT_CONFIG_TX_ENABLE , // 使能 发送中断
|
||||
UART_INTERRUPT_CONFIG_RX_ENABLE , // 使能 接收中断
|
||||
UART_INTERRUPT_CONFIG_ALL_ENABLE , // 使能 所有中断
|
||||
}uart_interrupt_config_enum;
|
||||
|
||||
typedef enum // 枚举 UART 中断状态 此枚举定义不允许用户修改
|
||||
{
|
||||
UART_INTERRUPT_STATE_NONE = 0x00 ,
|
||||
|
||||
UART_INTERRUPT_STATE_RX = 0x01 ,
|
||||
UART_INTERRUPT_STATE_TX = 0x02 ,
|
||||
|
||||
UART_INTERRUPT_STATE_ALL = 0x03 ,
|
||||
}uart_interrupt_state_enum;
|
||||
|
||||
#define UART_DEFAULT_TIMEOUT_COUNT ( 0x001FFFFF ) // 超时计数不能太短 否则会直接导致通信异常
|
||||
|
||||
extern void_callback_uint32_ptr uart_callback_list[UART_NUM];
|
||||
extern void *uart_callback_ptr_list[UART_NUM];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 字节输出
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 data 需要发送的字节
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_byte (uart_index_enum uart_index, const uint8 dat);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 发送数组
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *buff 要发送的数组地址
|
||||
// 参数说明 len 发送长度
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_buffer(uart_index, buff, len);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_buffer (uart_index_enum uart_index, const uint8 *buff, uint32 len);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 发送字符串
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *str 要发送的字符串地址
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_string(uart_index, str);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_string (uart_index_enum uart_index, const char *str);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 读取接收的数据(阻塞式 whlie 等待 会超时退出)
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 返回参数 uint8 ZF_TRUE - 接收成功 ZF_FALSE - 未接收到数据
|
||||
// 使用示例 uart_read_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_read_byte (uart_index_enum uart_index, uint8 *data);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 读取接收的数据(查询接收)
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 返回参数 uint8 ZF_TRUE - 接收成功 ZF_FALSE - 未接收到数据
|
||||
// 使用示例 uart_query_byte(uart_index, data);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_query_byte (uart_index_enum uart_index, uint8 *data);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 中断回调函数
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 callback 回调函数 为无返回值 uint32 加 void * 参数的函数
|
||||
// 参数说明 *ptr 回调参数 用户自拟定的参数指针 不需要的话就传入 NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_callback(uart_index, callback, ptr);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_callback (uart_index_enum uart_index, void_callback_uint32_ptr callback, void *ptr);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 中断设置
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 config 中断配置 (详见 zf_driver_uart.h 内 uart_interrupt_config_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_interrupt_config(uart_index, config);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_interrupt_config (uart_index_enum uart_index, uart_interrupt_config_enum config);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 UART 初始化
|
||||
// 参数说明 uart_index UART 模块号 (详见 zf_driver_uart.h 内 uart_index_enum 定义)
|
||||
// 参数说明 baudrate UART 波特率
|
||||
// 参数说明 tx_pin UART 发送引脚 (详见 zf_driver_uart.h 内 uart_tx_pin_enum 定义)
|
||||
// 参数说明 rx_pin UART 接收引脚 (详见 zf_driver_uart.h 内 uart_rx_pin_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_init(uart_index, baudrate, tx_pin, rx_pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_init (uart_index_enum uart_index, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user