【爱普特 APT32F110 ev board 试用测评连载-02】

基本框架

1:主程序逻辑界面

主程序.PNG

system_init(),主要包括系统时钟初始化;

可以根据自己项目和调试需要修改到需要的时钟;

system_init.PNG

board_init(),主要是包括一个调试串口的初始化(如果必须要用到该串口资源的话,可以不需要初始化);

串口可以根据需要进行调整,主要是端口和波特率;

board_init.PNG

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:自己的项目也在规划中,只是前期需要仔细把芯片功能以及使用做一下熟悉的过程,大家有问题欢迎交流;