基本框架
1:主程序逻辑界面
system_init(),主要包括系统时钟初始化;
可以根据自己项目和调试需要修改到需要的时钟;
board_init(),主要是包括一个调试串口的初始化(如果必须要用到该串口资源的话,可以不需要初始化);
串口可以根据需要进行调整,主要是端口和波特率;
2:测试程序
2.1:GPIO输出配置
2.1.1:输出模式配置
/** \brief config gpio output mode
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] eOutMode: pin open drain/push pull(output mode)
* \return error code \ref csi_error_t
*/
csi_gpio_port_output_mode(csp_gpio_t *ptGpioBase, uint32_t wPinMask, csi_gpio_output_mode_e eOutMode)
2.1.2:输出低电平
/** \brief set gpio ouput low
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \return none
*/
void csi_gpio_port_set_low(csp_gpio_t *ptGpioBase, uint32_t wPinMask)
2.1.3:输出高电平
/** \brief set gpio ouput high
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \return none
*/
void csi_gpio_port_set_high(csp_gpio_t *ptGpioBase, uint32_t wPinMask)
2.1.4:写端口
/** \brief write gpio ouput value
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] ePinVal: gpio output value;
* \return none
*/
void csi_gpio_port_write(csp_gpio_t *ptGpioBase, uint32_t wPinMask, csi_gpio_pin_state_e ePinVal)
2.1.5:端口取反
/** \brief set gpio toggle
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \return none
*/
void csi_gpio_port_toggle(csp_gpio_t *ptGpioBase, uint32_t wPinMask)
/*********************************************DemoCode*********************************************/ /** \brief gpio port output demo * * \param[in] none * \return error code */ int gpio_port_ouput_demo(void) { int iRet = 0; uint32_t wPinMask = PINMASK_PA00 | PINMASK_PA02; //GPIOA0端口,PA00/PA02 csi_gpio_port_dir(GPIOA0, wPinMask, GPIO_DIR_OUTPUT); //GPIOA0 端口配置为输出 csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); csi_gpio_port_set_low(GPIOA0, wPinMask); //输出低 mdelay(100); csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); csi_gpio_port_output_mode(GPIOA0, wPinMask, GPIO_OPEN_DRAIN); //GPIOA0 端口配置为开漏输出 csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); csi_gpio_port_set_low(GPIOA0, wPinMask); //输出低 mdelay(100); csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); csi_gpio_port_output_mode(GPIOA0, wPinMask, GPIO_PUSH_PULL); //GPIOA0 端口配置为推挽输出 csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); csi_gpio_port_set_low(GPIOA0, wPinMask); //输出低 mdelay(100); csi_gpio_port_set_high(GPIOA0, wPinMask); //输出高 mdelay(100); my_printf("GPIO PINMASK: %d \n", wPinMask); return iRet; } /*********************************************DemoCode*********************************************/ /** \brief gpio pin output demo * * \param[in] none * \return error code */ int pin_output_demo(void) { int iRet = 0; csi_pin_set_mux(PB00,PB00_OUTPUT); //PB00 配置为输出 csi_pin_set_high(PB00); //PB00 输出高 mdelay(100); //延时100ms csi_pin_set_low(PB00); //PB00 输出低 mdelay(100); csi_pin_set_high(PB00); //PB00 输出低 mdelay(100); csi_pin_output_mode(PB00, GPIO_OPEN_DRAIN); //PB00 配置为开漏输出 csi_pin_set_high(PB00); mdelay(100); csi_pin_set_low(PB00); mdelay(100); csi_pin_set_high(PB00); mdelay(100); csi_pin_output_mode(PB00, GPIO_PUSH_PULL); //PB00 配置为推挽输出 csi_pin_set_high(PB00); mdelay(100); csi_pin_set_low(PB00); mdelay(100); csi_pin_set_high(PB00); mdelay(100); return iRet; }
2.2:GPIO输入配置
2.2.1:输入模式配置
/** \brief config gpio input mode
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] eInputMode: pin input mode; TTL1/TTL2
* \return error code \ref csi_error_t
*/
csi_error_t csi_gpio_port_input_mode(csp_gpio_t *ptGpioBase, uint32_t wPinMask, csi_gpio_input_mode_e eInputMode)
2.2.2:输入滤波器使能配置
/** \brief config gpio input filtering
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] bEnable: ENABLE/DISABLE
* \return none
*/
void csi_gpio_port_input_filter(csp_gpio_t *ptGpioBase, uint32_t wPinMask, bool bEnable)
2.2.3:读端口状态
/** \brief read gpio status value
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \return value gpio port select wPinMask
*/
uint32_t csi_gpio_port_read(csp_gpio_t *ptGpioBase, uint32_t wPinMask)
/*********************************************DemoCode*********************************************/ /** \brief gpio port intput demo * * \param[in] none * \return error code */ int gpio_port_input_demo(void) { int iRet = 0; uint32_t wStatus; uint32_t wPinMask = PINMASK_PA00 | PINMASK_PA02; //GPIOA0端口,PA00/PA02 csi_gpio_port_dir(GPIOA0, wPinMask, GPIO_DIR_INPUT); //GPIOA0 端口配置为输入 csi_gpio_port_pull_mode(GPIOA0, wPinMask, GPIO_PULLNONE); //无上下拉 mdelay(100); wStatus = csi_gpio_port_read(GPIOA0,wPinMask); while(wStatus != 0); csi_gpio_port_pull_mode(GPIOA0, wPinMask, GPIO_PULLUP); //上拉 mdelay(100); wStatus = csi_gpio_port_read(GPIOA0,wPinMask); while(wStatus != wPinMask); csi_gpio_port_pull_mode(GPIOA0, wPinMask, GPIO_PULLDOWN); //下拉 mdelay(100); wStatus = csi_gpio_port_read(GPIOA0,wPinMask); while(wStatus != 0); return iRet; } /*********************************************DemoCode*********************************************/ /** \brief gpio pin intput demo * * \param[in] none * \return error code */ int pin_input_demo(void) { int iRet = 0; uint32_t wStatus; csi_pin_set_mux(PA08,PA05_INPUT); //PA08 配置为输入 csi_pin_pull_mode(PA08,GPIO_PULLNONE); //无上下拉 mdelay(100); wStatus = csi_pin_read(PA08); //PA08 输入状态读取(0/1 = 高/低) while(wStatus != 0); csi_pin_pull_mode(PA08,GPIO_PULLUP); //上拉 mdelay(100); wStatus = csi_pin_read(PA08); while(wStatus != (0x01 << 0x08)); csi_pin_pull_mode(PA08,GPIO_PULLDOWN); //下拉 mdelay(100); wStatus = csi_pin_read(PA08); while(wStatus != 0); return iRet; }
2.3:GPIO输入中断配置
2.3.1:中断模式配置
/** \brief config gpio irq mode
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] eTrgEdge: rising edge; falling edge;both edge;
* \return error code \ref csi_error_t
*/
csi_error_t csi_gpio_port_irq_mode(csp_gpio_t *ptGpioBase, uint32_t wPinMask, csi_gpio_irq_mode_e eTrgEdge)
2.3.2:中断使能配置
/** \brief gpio irq enable
*
* \param[in] ptGpioBase: pointer of gpio register structure
* \param[in] wPinMask: pin mask,0x0001~0xffff
* \param[in] bEnable: true or false
* \return none
*/
void csi_gpio_port_irq_enable(csp_gpio_t *ptGpioBase, uint32_t wPinMask, bool bEnable)
/*********************************************DemoCode*********************************************/ /** \brief gpio port interrupt * * \param[in] none * \return error code */ int gpio_port_irq_demo(void) { int iRet = 0; uint32_t wPinMask = PINMASK_PA00 | PINMASK_PA02 | PINMASK_PA013; //GPIOA0端口,PA00/PA02/PA05 csi_gpio_port_dir(GPIOA0, wPinMask, GPIO_DIR_INPUT); //端口配置为输入 csi_gpio_port_pull_mode(GPIOA0, wPinMask, GPIO_PULLUP); //上拉 csi_gpio_port_irq_mode(GPIOA0,wPinMask,GPIO_IRQ_FALLING_EDGE); //下降沿 csi_gpio_port_irq_enable(GPIOA0,wPinMask,ENABLE); //使能GPIOA0端口对应外部中断 return iRet; } /*********************************************DemoCode*********************************************/ /** \brief gpio pin intput interrupt demo * * \param[in] none * \return error code */ int pin_irq_demo(void) { int iRet = 0; csi_imosc_enable(2); csi_exi_flt_enable(EXI_FLT_CKDIV4, ENABLE); //EXI 去抖滤波 csi_pin_set_mux(PB01, PB01_INPUT); //PB01 配置为输入 csi_pin_pull_mode(PB01, GPIO_PULLUP); //PB01 上拉 csi_pin_irq_mode(PB01, EXI_GRP18, GPIO_IRQ_FALLING_EDGE); //PB01 下降沿产生中断 csi_pin_irq_enable(PB01, EXI_GRP18, ENABLE); //PB01 中断使能,选择中断组5 return iRet; }
3:总结
本期主要是介绍开发板的GPIO相关的开发,其实掌握了一个MCU的输入输出其实基本就可以入门一个芯片了,后期的项目只是利用了芯片的其他外设,实现了一个更为复杂的功能;
PS:自己的项目也在规划中,只是前期需要仔细把芯片功能以及使用做一下熟悉的过程,大家有问题欢迎交流;