# 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 ()
/*任务优先级*/# 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晶体沉降。* BLE, USB和UART块要求XTAL32M向上和*运行正常。* /pm_set_wakeup_mode(真正的);/*设置所需的休眠模式。* /pm_sleep_mode_set(pm_mode_extended_sleep);/**设置所需的唤醒模式。** \警告当设置为超快唤醒模式时,睡眠电压应为0.9V*且不能少于。** * /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 (0x8000)定义MCP4822_GA_CONTROL_BIT_Msk (0x2000)#定义MCP4822_SHDN_CONTROL_BIT_Msk (0x1000)/*获取MCP48822控制位的掩码*/#定义MCP4822_GET_MSK(x/* MCP4822控制位*/类型定义枚举{MCP4822_AB_CONTROL_BIT_RESET=0,/*选择DACA通道*/MCP4822_GA_CONTROL_BIT_RESET=0,/*输出增益1x */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(遗传算法),/*输出增益2x *//*激活所选的DAC通道*/MCP4822_SHDN_CONTROL_BIT_SET=MCP4822_GET_MSK(SHDN)}MCP4822_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_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写操作,即任务不写* block等待事务完成。交易完成后*回调函数被触发,指示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("发送的值%04Xr \ 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)*//*最大模拟输出:2048mv(位13)*/MCP4822_GA_CONTROL_BIT_SET,/*激活所选DAC通道(比特12)*/MCP4822_SHDN_CONTROL_BIT_SET,/*所选DAC通道的模拟输出(比特11-0)*/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();/**避免在ISR上下文中使用printf() !!这可能会导致代码崩溃。*相反,使用通知通知任务执行操作!!* //*通知[prvSPITask_MCP_4822]任务执行SPI操作的时间*已经过了。* /OS_EVENT_SIGNAL_FROM_ISR(signal_MCP4822);}/*初始化WKUP控制器*/静态无效wkup_init(无效){/*初始化WKUP控制器*/hw_wkup_init(零);/**设置弹跳时间,单位为ms,最大允许值为63ms。*一个值设置为0禁用debounce功能。* /hw_wkup_set_debounce_time(10);/**启用唤醒控制器的KEY块产生的中断(debounce .*电路)并注册一个回调函数来命中一个KEY事件。* /hw_wkup_register_key_interrupt(wkup_cb,1);/**设置触发WKUP控制器的极性(上升/下降沿)。** \note极性同时应用于控制器的KEY和GPIO块** /hw_wkup_configure_pin(KEY1_PORT,KEY1_PIN,1,HW_WKUP_PIN_STATE_LOW);/*开启WKUP控制器中断*/hw_wkup_enable_irq();}
prvSetupHardware ()
/**硬件初始化* /静态无效prvSetupHardware(无效){/**唤醒控制器的KEY子块产生的IRQ (debpublished* IO IRQ)与其他触发源(VBUS IRQ, SYS2CMAC IRQ,* JTAG存在)在单个PDC外围触发器ID中* (HW_PDC_PERIPH_TRIG_ID_COMBO)。* /#if !defined(CONFIG_USE_BLE) && (!dg_configENABLE_DEBUGGER) && (!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);/*在处理任何GPIO引脚之前先使能COM电源域*/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);/*处理完GPIO引脚后关闭COM电源域*/hw_sys_pd_com_disable();}
/********************************************************外设专用配置* /#定义dg_configSPI_ADAPTER (1)#定义dg_configUSE_HW_SPI (1)
/*** 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从设备交互时,将应用这些设置。
platform_devices.c
# 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_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_#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