# include“hw_pdc.h”# include“ad_spi.h”# include“hw_wkup.h”# include“hw_sys.h”# include< stdlib.h ># include“peripheral_setup.h”# include“platform_devices.h”
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);}
/ ** 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*)®_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);}}
* / / * WKUP关键中断处理程序静态无效wkup_cb(无效){/ *清楚WKUP中断标志! ! !* /hw_wkup_reset_interrupt();/ **避免使用printf()在ISR中! ! !它可能代码崩溃。*相反,使用通知通知任务执行操作! !* // **通知[prvSPITask_MCP_4822]任务执行SPI操作的时间*运行。* /OS_EVENT_SIGNAL_FROM_ISR(signal_MCP4822);}/ *初始化* / WKUP控制器静态无效wkup_init(无效){/ *初始化* / WKUP控制器hw_wkup_init(零);/ **设置防反跳时间表达女士最大容许值是63 ms。*一个值设置为0禁用防反跳的功能。* /hw_wkup_set_debounce_time(10);/ **使唤醒的关键块产生的中断控制器(防反跳*电路),注册一个回调函数达到关键事件。* /hw_wkup_register_key_interrupt(wkup_cb,1);/ **设置极性(上升/下降沿)触发WKUP控制器。** \注意极性应用关键和GPIO的控制器** /hw_wkup_configure_pin(KEY1_PORT,KEY1_PIN,1,HW_WKUP_PIN_STATE_LOW);* / / *使中断WKUP控制器hw_wkup_enable_irq();}
prvSetupHardware ()
/ * ** @brief硬件初始化* /静态无效prvSetupHardware(无效){/ **生产的硬中断请求优先级别的关键子块唤醒控制器(防反跳* IO IRQ)是多路复用与其他触发源(通风装置IRQ, SYS2CMAC硬中断请求优先级别,* JTAG存在)在一个单一的PDC外围触发ID* (HW_PDC_PERIPH_TRIG_ID_COMBO)。* /#如果!定义(CONFIG_USE_BLE) & & (! dg_configENABLE_DEBUGGER) & & (dg_configUSE_SYS_CHARGER !)pdc_wkup_combo_id=hw_pdc_add_entry(HW_PDC_LUT_ENTRY_VAL(HW_PDC_TRIG_SELECT_PERIPHERAL,HW_PDC_PERIPH_TRIG_ID_COMBO,HW_PDC_MASTER_CM33,0));OS_ASSERT(pdc_wkup_combo_id! =HW_PDC_INVALID_LUT_INDEX);/ * * /hw_pdc_set_pending(pdc_wkup_combo_id);hw_pdc_acknowledge(pdc_wkup_combo_id);# endifwkup_init();/ *初始化硬件* /pm_system_init(periph_init);/ *使COM权力域处理任何GPIO之前销* /hw_sys_pd_com_enable();ad_spi_io_config(((ad_spi_controller_conf_t*)DAC_MC4822_DEVICE)- >id,((ad_spi_controller_conf_t*)DAC_MC4822_DEVICE)- >io,AD_IO_CONF_OFF);/ * Pro DevKit上配置KEY1按钮* /HW_GPIO_SET_PIN_FUNCTION(KEY1);HW_GPIO_PAD_LATCH_ENABLE(KEY1);/ *锁定目标的模式GPIO销* /HW_GPIO_PAD_LATCH_DISABLE(KEY1);/ *禁用COM域处理的针后* /hw_sys_pd_com_disable();}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **外围具体配置* /#定义dg_configSPI_ADAPTER (1)#定义dg_configUSE_HW_SPI (1)
/ * ** 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奴隶设备交互。
platform_devices.c
# 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文件中,添加以下定义:
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