5.2.系统初始化代码c文件,替换system_init ()例程使用以下代码:

/*任务优先级*/# OS_TASK_PRIORITY_NORMAL/*启用/禁用异步SPI操作*/#定义SPI_ASYNC_EN (1)/*保留符号*/__RETAINED静态OS_EVENTsignal_MCP4822__RETAINED静态OS_EVENTsignal_MCP4822_async/* SPI操作返回的错误代码__RETAINED静态intSPI_error_code/* SPI任务句柄__RETAINED静态OS_TASKprvSPITask_huint32_tpdc_wkup_combo_id使用__attribute__((未使用的));/**任务功能* /静态无效prvSPITask_MCP_4822无效*pvParameters);静态无效system_init无效*pvParametersOS_BASE_TYPE状态REG_SETFGPREGDEBUG_REGSYS_CPU_FREEZE_EN0);#如果定义了CONFIG_RETARGET走读生无效retarget_init无效);# endif/* config_retarget *//**准备时钟。注意:可以调用cm_cpu_clk_set()和cm_sys_clk_set()*只从一个任务,因为他们将暂停任务,直到XTAL32M*解决,也许,锁相环是锁定的。* /cm_sys_clk_initsysclk_XTAL32M);cm_apb_set_clock_dividerapb_div1);cm_ahb_set_clock_dividerahb_div1);cm_lp_clk_init();/*准备硬件来运行这个演示*/prvSetupHardware();#如果定义了CONFIG_RETARGETretarget_init();# endif/* config_retarget */OS_EVENT_CREATEsignal_MCP4822);OS_EVENT_CREATEsignal_MCP4822_async);/**在一个唤醒周期,等待XTAL32M晶体沉降。* BLE, USB和UART块要求XTAL32M向上和*运行正常。* /pm_set_wakeup_mode真正的);/*设置所需的休眠模式。* /pm_sleep_mode_setpm_mode_extended_sleep);/**设置所需的唤醒模式。** \警告当设置为超快唤醒模式时,睡眠电压应为0.9V*且不能少于。** * /pm_set_sys_wakeup_modepm_sys_wakeup_mode_fast);/* SPI任务状态OS_TASK_CREATE“SPI”/*分配给任务的文本名称,用于调试;内核不使用。* /prvSPITask_MCP_4822/*实现任务的函数。* //*传递给任务的参数。* /1024*OS_STACK_WORD_SIZE/*分配给任务的堆栈大小字节。* /mainSPI_TASK_PRIORITY/*分配给任务的优先级* /prvSPITask_h);/*任务句柄。* /OS_ASSERT状态= =OS_TASK_CREATE_SUCCESS);/* SysInit任务已经完成*/OS_TASK_DELETExHandle);

5.3.MCP4822 DAC模块的任务代码c档案及之后system_init (),添加以下代码,用于与外部连接在SPI1总线上的MCP4822 DAC模块交互:

/** MCP4822 DAC模块配置宏************************************************************************************ //* MCP4822控制位掩码*/#定义MCP4822_AB_CONTROL_BIT_Msk (0x8000)定义MCP4822_GA_CONTROL_BIT_Msk (0x2000)#定义MCP4822_SHDN_CONTROL_BIT_Msk (0x1000)/*获取MCP48822控制位的掩码*/#定义MCP4822_GET_MSK(x/* MCP4822控制位*/类型定义枚举MCP4822_AB_CONTROL_BIT_RESET0/*选择DACA通道*/MCP4822_GA_CONTROL_BIT_RESET0/*输出增益1x */MCP4822_SHDN_CONTROL_BIT_RESET0/*关闭所选的DAC通道*/MCP4822_AB_CONTROL_BIT_SETMCP4822_GET_MSKAB),/*选择DACB通道*/MCP4822_GA_CONTROL_BIT_SETMCP4822_GET_MSK遗传算法),/*输出增益2x *//*激活所选的DAC通道*/MCP4822_SHDN_CONTROL_BIT_SETMCP4822_GET_MSKSHDNMCP4822_CONTROL_BITS/*设置MCP4822 2字节寄存器*/#定义MCP4822_SET_REG(AB_BIT, GA_BIT, SHDN_BIT, DATA, VAR) VAR = ((VAR & 0x0) | \((DATA & 0xFFF) | \(ab_bit | ga_bit | shdn_bit)#如果SPI_ASYNC_EN == 1/*在SPI异步事务上调用的回调函数。** \param[in] user_data函数中可以传递和使用的用户数据* /无效spi_mcp_4822_cb无效*user_datauint16_tnum_of_data/*信号[prvSPITask_MCP_4822]恢复时间已过*/OS_EVENT_SIGNAL_FROM_ISRsignal_MCP4822_async);# endif/*向DAC模块写入数据的函数*/静态无效dac_data_writerspi_devicedevuint16_t瓦尔/*打开SPI设备*/ad_spi_handle_tspi_devad_spi_open((ad_spi_controller_conf_t*dev);/*使能目标SPI设备*/ad_spi_activate_csspi_dev);#如果SPI_ASYNC_EN == 0/**执行同步SPI写操作,即任务被阻塞*等待交易完成。交易完成后,*被阻塞的任务解除阻塞并恢复其操作。* /SPI_error_codead_spi_writespi_dev常量uint8_t*reg_val运算符uint16_t));其他#/**执行异步SPI写操作,即任务不写* block等待事务完成。交易完成后*回调函数被触发,指示SPI操作的完成* /SPI_error_codead_spi_write_asyncspi_dev常量uint8_t*瓦尔运算符uint16_t),spi_mcp_4822_cb);/**同时,当SPI事务在后台执行时,*应用任务可以进行其他操作/计算。*重要的是,新的操作不涉及SPI事务*在已经被占用的公交车上!!* //**确保当前SPI操作已经完成,*永远阻塞在这里。* /OS_EVENT_WAITsignal_MCP4822_asyncOS_EVENT_FOREVER);# endif/*禁用目标SPI设备*/ad_spi_deactivate_csspi_dev);/*关闭SPI设备*/ad_spi_closespi_dev真正的);/*在串口控制台上打印SPI操作的状态*/如果SPI_error_code= =0printf"发送的值%04Xr \ n \瓦尔);其他的printfr \ n \不成功的SPI写入操作,错误代码:%dr \ n \SPI_error_code);/*** @brief负责执行SPI相关操作的任务* /静态无效prvSPITask_MCP_4822无效*pvParametersuint16_treg_valuint16_tanalog_output0printfr \ n \***SPI演示示例***r \ n \);/** SPI适配器初始化应该在开始时完成一次。*或者,这个函数可以在系统期间被调用* system_init()中的初始化。* /ad_spi_init();/*配置MCP4822 DAC模块*/MCP4822_SET_REGMCP4822_AB_CONTROL_BIT_SET/*选择DAC通道B(比特15)*//*最大模拟输出:2048mv(位13)*/MCP4822_GA_CONTROL_BIT_SET/*激活所选DAC通道(比特12)*/MCP4822_SHDN_CONTROL_BIT_SET/*所选DAC通道的模拟输出(比特11-0)*/analog_outputreg_val);/*设置MCP4822模块时的返回值*/(,)/**暂停任务执行-尽快WKUP回调功能触发*,任务恢复执行。* /OS_EVENT_WAITsignal_MCP4822OS_EVENT_FOREVER);/*执行SPI写操作*/dac_data_writerDAC_MC4822_DEVICEreg_val);/**为所选模拟输出选择任意值* DAC通道。* /analog_outputuint16_t兰德();/*配置MCP4822 DAC模块*/MCP4822_SET_REGMCP4822_AB_CONTROL_BIT_SETMCP4822_GA_CONTROL_BIT_SETMCP4822_SHDN_CONTROL_BIT_SETanalog_outputreg_val);

5.7.设备配置peripheral_setup.h文件,为目标应用程序使用的GPIO引脚添加宏定义:

/*** SPI 1配置* /#定义DAC_MC4822_DO_PORT (hw_gpio_port)#定义DAC_MC4822_DO_PIN (HW_GPIO_PIN_26)#定义DAC_MC4822_DI_PORT#定义DAC_MC4822_DI_PIN (HW_GPIO_PIN_27)#定义hw_gpio_port#定义DAC_MC4822_CLK_PIN (HW_GPIO_PIN_28)/* SPI芯片选择引脚*/#定义HW_GPIO_PORT_0#定义DAC_MC4822_CS_PIN (HW_GPIO_PIN_29)/*** SPI 2配置* /

platform_devices.c文件,为所使用的SPI设备添加IO总线以及驱动程序配置。当应用程序任务试图与目标SPI从设备交互时,将应用这些设置。

# include< ad_spi.h ># include“peripheral_setup.h”# include“platform_devices.h”/**平台外设gpio配置****************************************************************************************** /#if dg_configSPI_ADAPTER || dg_configUSE_HW_SPI . #/* SPI芯片选择引脚*/静态常量ad_io_conf_tspi_master_cs[]{{港口DAC_MC4822_CS_PORTDAC_MC4822_CS_PIN模式HW_GPIO_MODE_OUTPUT_PUSH_PULL函数HW_GPIO_FUNC_SPI_EN真正的},模式HW_GPIO_MODE_OUTPUT_PUSH_PULL函数HW_GPIO_FUNC_SPI_EN真正的}},};/* spi1 IO */常量ad_spi_io_conf_tbus_SPI1spi_do港口DAC_MC4822_DO_PORTDAC_MC4822_DO_PINHW_GPIO_MODE_OUTPUT_PUSH_PULLHW_GPIO_FUNC_SPI_DO},HW_GPIO_MODE_INPUTHW_GPIO_FUNC_GPIO真正的},},spi_di港口DAC_MC4822_DI_PORTDAC_MC4822_DI_PINHW_GPIO_MODE_INPUTHW_GPIO_FUNC_SPI_DI},HW_GPIO_MODE_INPUTHW_GPIO_FUNC_GPIO真正的},},spi_clk港口DAC_MC4822_CLK_PORTDAC_MC4822_CLK_PINHW_GPIO_MODE_OUTPUT_PUSH_PULLHW_GPIO_FUNC_SPI_CLK},HW_GPIO_MODE_INPUTHW_GPIO_FUNC_GPIO真正的},},/** spi_master_cs数组中的引脚数。*当SPI总线被SNC \p使用时,cs_cnt必须始终为1* /cs_cnt1spi_csspi_master_csvoltage_levelHW_GPIO_POWER_V33};/*外部传感器/模块SPI驱动*/常量ad_spi_driver_conf_tdrv_SPI1spics_padDAC_MC4822_CS_PORTDAC_MC4822_CS_PIN},word_modeHW_SPI_WORD_16BIT/* 2字节模式*/smn_roleHW_SPI_MODE_MASTERpolarity_modeHW_SPI_POL_LOWphase_modeHW_SPI_PHA_MODE_0mint_modeHW_SPI_MINT_DISABLExtal_freqHW_SPI_FREQ_DIV_8fifo_modeHW_SPI_FIFO_RX_TX禁用0/*在初始化阶段应禁用*/ignore_csuse_dma真正的rx_dma_channelHW_DMA_CHANNEL_0tx_dma_channelHW_DMA_CHANNEL_1};/*传感器/模块设备配置*/常量ad_spi_controller_conf_tdev_SPI_CUSTOM_DEVICEidHW_SPI1iobus_SPI1drvdrv_SPI1};spi_deviceDAC_MC4822_DEVICEdev_SPI_CUSTOM_DEVICE# endif/* dg_configSPI_ADAPTER || dg_configUSE_HW_SPI */

platform_devices.h文件,添加以下定义:

# include< ad_spi.h ># include“peripheral_setup.h”# ifdef __cplusplus走读生“C”# endif#定义_SPI_CUSTOM_DEVICE_#if dg_configSPI_ADAPTER || dg_configUSE_HW_SPI . #/**简单的SPI设备句柄* /类型定义常量无效*spi_device# endif/* dg_configSPI_ADAPTER || dg_configUSE_HW_SPI *//*设备列表*/走读生spi_deviceDAC_MC4822_DEVICE# ifdef __cplusplus# endif