5.2。系统初始化代码c文件,替换system_init ()常规使用以下代码:

/ *任务优先级* /#定义mainSPI_TASK_PRIORITY (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_h;uint32_tpdc_wkup_combo_id使用__attribute__((未使用的));/ **任务功能* /静态无效prvSPITask_MCP_4822(无效*pvParameters);静态无效system_init(无效*pvParameters){OS_BASE_TYPE状态;REG_SETF(GPREG,DEBUG_REG,SYS_CPU_FREEZE_EN,0);#如果定义CONFIG_RETARGET走读生无效retarget_init(无效);# endif/ * CONFIG_RETARGET * // **准备时钟。注意:cm_cpu_clk_set()和cm_sys_clk_set可以称为()*只从一个任务,因为他们将暂停,直到XTAL32M的任务*定居,也许,锁相环是锁着的。* /cm_sys_clk_init(sysclk_XTAL32M);cm_apb_set_clock_divider(apb_div1);cm_ahb_set_clock_divider(ahb_div1);cm_lp_clk_init();/ *准备硬件来运行这个演示* /prvSetupHardware();#如果定义CONFIG_RETARGETretarget_init();# endif/ * CONFIG_RETARGET * /OS_EVENT_CREATE(signal_MCP4822);OS_EVENT_CREATE(signal_MCP4822_async);/ **在唤醒循环,等待XTAL32M水晶来解决。*祝福,USB和UART块需要XTAL32M起来*正常工作运行。* /pm_set_wakeup_mode(真正的);/ *设置所需的睡眠模式。* /pm_sleep_mode_set(pm_mode_extended_sleep);/ **设置所需的唤醒模式。** \警告当集是超高速唤醒模式,睡眠电压0.9 v*不少于。** * /pm_set_sys_wakeup_mode(pm_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_DELETE(xHandle);}

5.3。任务代码MCP4822 DAC模块c文件后,system_init (),添加下面的代码用于与MCP4822 DAC模块外部交互SPI1总线上连接:

/ ** MCP4822 DAC模块配置宏* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** // * MCP4822控制位面具* /#定义MCP4822_AB_CONTROL_BIT_Msk (0 x8000)#定义MCP4822_GA_CONTROL_BIT_Msk储罐0)#定义MCP4822_SHDN_CONTROL_BIT_Msk (0 x1000)/ *得到的面具MCP48822控制* /#定义MCP4822_GET_MSK x (x) MCP4822_ # # # # _CONTROL_BIT_Msk* / / * MCP4822控制位类型定义枚举{MCP4822_AB_CONTROL_BIT_RESET=0,* / / *选择DACA频道MCP4822_GA_CONTROL_BIT_RESET=0,/ *输出增益1 x * /MCP4822_SHDN_CONTROL_BIT_RESET=0,/ *关闭选定的DAC频道* /MCP4822_AB_CONTROL_BIT_SET=MCP4822_GET_MSK(AB),* / / *选择DACB频道MCP4822_GA_CONTROL_BIT_SET=MCP4822_GET_MSK(遗传算法),/ *输出增益2 x * /* / / *激活选定的DAC频道MCP4822_SHDN_CONTROL_BIT_SET=MCP4822_GET_MSK(SHDN)}MCP4822_CONTROL_BITS;/ *设置MCP4822 2字节寄存器* /#定义MCP4822_SET_REG (AB_BIT GA_BIT SHDN_BIT,数据,VAR) VAR = ((VAR & 0 x0) | \((数据& 0 xfff) | \(AB_BIT | GA_BIT | SHDN_BIT)))#如果SPI_ASYNC_EN = = 1/ **回调函数要求一个SPI异步事务。** \参数[在]user_data用户数据,可以通过在功能和使用* /无效spi_mcp_4822_cb(无效*user_data,uint16_tnum_of_data){/ *信号[prvSPITask_MCP_4822]时间恢复运行* /OS_EVENT_SIGNAL_FROM_ISR(signal_MCP4822_async);}# endif/ *函数用于写入数据到DAC模块* /静态无效dac_data_writer(spi_devicedev,uint16_t瓦尔){* / / *打开SPI设备ad_spi_handle_tspi_dev=ad_spi_open((ad_spi_controller_conf_t*)dev);* / / *使目标SPI设备ad_spi_activate_cs(spi_dev);#如果SPI_ASYNC_EN = = 0/ **执行同步SPI写操作,也就是说,任务是阻止*等待事务结束。在事务完成,*阻塞任务的疏导和继续操作。* /SPI_error_code=ad_spi_write(spi_dev,(常量uint8_t*)&reg_val,运算符(uint16_t));其他#/ **执行异步SPI写操作,也就是说,任务不*块等待事务结束。在事务完成时*触发回调函数表明SPI的完成操作* /SPI_error_code=ad_spi_write_async(spi_dev,(常量uint8_t*)&瓦尔,运算符(uint16_t),spi_mcp_4822_cb,);/ **同时,SPI事务是在后台执行的,*应用程序可以继续其他操作任务/计算。*至关重要,新业务不涉及SPI的事务*已经占领了总线上的! ! !* // **确保当前SPI操作完成时,*永远阻塞在这里。* /OS_EVENT_WAIT(signal_MCP4822_async,OS_EVENT_FOREVER);# endif* / / *禁用目标SPI设备ad_spi_deactivate_cs(spi_dev);/ * * /关闭SPI设备ad_spi_close(spi_dev,真正的);/ *打印在串行控制台的状态* / SPI操作如果(SPI_error_code= =0){printf(“价值发送x % 04r \ n \,瓦尔);}其他的{printf(r \ n \SPI写操作失败,错误代码:% dr \ n \,SPI_error_code);}}/ * ** @brief任务负责执行相关的SPI操作* /静态无效prvSPITask_MCP_4822(无效*pvParameters){uint16_treg_val;uint16_tanalog_output=0;printf(r \ n \* * * * * * SPI示范例子r \ n \);/ ** SPI适配器初始化一开始应该做一次。*另外,这个函数可以被称为在系统*初始化system_init ()。* /ad_spi_init();* / / *配置MCP4822 DAC模块MCP4822_SET_REG(MCP4822_AB_CONTROL_BIT_SET,/ *选择DAC通道B (15) * // *最大模拟输出:2048 mV(13位)* /MCP4822_GA_CONTROL_BIT_SET,/ *激活选定的DAC通道(12)* /MCP4822_SHDN_CONTROL_BIT_SET,/ *选DAC的模拟输出通道(位11)* /analog_output,reg_val);/ *返回值用于设置MCP4822模块* /(,){/ **暂停任务执行,一旦WKUP回调函数*被触发,任务继续执行。* /OS_EVENT_WAIT(signal_MCP4822,OS_EVENT_FOREVER);/ * * /执行一个SPI写操作dac_data_writer(DAC_MC4822_DEVICE,reg_val);/ **选择一个任意值的模拟输出* DAC通道。* /analog_output=(uint16_t)兰德();* / / *配置MCP4822 DAC模块MCP4822_SET_REG(MCP4822_AB_CONTROL_BIT_SET,MCP4822_GA_CONTROL_BIT_SET,MCP4822_SHDN_CONTROL_BIT_SET,analog_output,reg_val);}}

5.7。设备配置peripheral_setup.h文件,添加宏定义的目标应用程序所使用的针:

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

platform_devices.c文件,添加输入输出总线以及驱动程序配置SPI设备(s)使用。这些设置将被应用在应用程序任务试图与目标SPI奴隶设备交互。

# include< ad_spi.h ># include“peripheral_setup.h”# include“platform_devices.h”/ ** GPIO平台外围设备配置* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** /#如果dg_configSPI_ADAPTER | | dg_configUSE_HW_SPI/ * SPI芯片选择针* /静态常量ad_io_conf_tspi_master_cs[]={{港口=DAC_MC4822_CS_PORT,=DAC_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_SPI1={spi_do={港口=DAC_MC4822_DO_PORT,=DAC_MC4822_DO_PIN,={HW_GPIO_MODE_OUTPUT_PUSH_PULL,HW_GPIO_FUNC_SPI_DO,},={HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_GPIO,真正的},},spi_di={港口=DAC_MC4822_DI_PORT,=DAC_MC4822_DI_PIN,={HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_SPI_DI,},={HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_GPIO,真正的},},spi_clk={港口=DAC_MC4822_CLK_PORT,=DAC_MC4822_CLK_PIN,={HW_GPIO_MODE_OUTPUT_PUSH_PULL,HW_GPIO_FUNC_SPI_CLK,},={HW_GPIO_MODE_INPUT,HW_GPIO_FUNC_GPIO,真正的},},/ **的针数spi_master_cs数组。** \警告当SPI总线被SNC \ p cs_cnt必须总是1* /cs_cnt=1,spi_cs=spi_master_cs,voltage_level=HW_GPIO_POWER_V33};/ *外部传感器/ SPI模块驱动程序* /常量ad_spi_driver_conf_tdrv_SPI1={spi={cs_pad={DAC_MC4822_CS_PORT,DAC_MC4822_CS_PIN},word_mode=HW_SPI_WORD_16BIT,* / / * 2字节模式smn_role=HW_SPI_MODE_MASTER,polarity_mode=HW_SPI_POL_LOW,phase_mode=HW_SPI_PHA_MODE_0,mint_mode=HW_SPI_MINT_DISABLE,xtal_freq=HW_SPI_FREQ_DIV_8,fifo_mode=HW_SPI_FIFO_RX_TX,禁用=0,在初始化阶段应该禁用/ * * /ignore_cs=,use_dma=真正的,rx_dma_channel=HW_DMA_CHANNEL_0,tx_dma_channel=HW_DMA_CHANNEL_1}};设备配置* / / *传感器/模块常量ad_spi_controller_conf_tdev_SPI_CUSTOM_DEVICE={id=HW_SPI1,io=&bus_SPI1,drv=&drv_SPI1};spi_deviceDAC_MC4822_DEVICE=&dev_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_#如果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