pikapython/package/CH32V103/CH32V103_GPIO.c
2021-11-23 00:38:53 +08:00

143 lines
3.6 KiB
C

#include "CH32V103_GPIO.h"
#include "debug.h"
GPIO_TypeDef *get_GPIO_group(char *pin){
if(strIsStartWith(pin, "PA")){
return GPIOA;
}
if(strIsStartWith(pin, "PB")){
return GPIOB;
}
if(strIsStartWith(pin, "PC")){
return GPIOC;
}
if(strIsStartWith(pin, "PD")){
return GPIOD;
}
return NULL;
}
uint16_t get_GPIO_pin(char *pin){
pin = pin + 2;
if (strEqu(pin, "0")) {
return GPIO_Pin_0;
}
if (strEqu(pin, "1")) {
return GPIO_Pin_1;
}
if (strEqu(pin, "2")) {
return GPIO_Pin_2;
}
if (strEqu(pin, "3")) {
return GPIO_Pin_3;
}
if (strEqu(pin, "4")) {
return GPIO_Pin_4;
}
if (strEqu(pin, "5")) {
return GPIO_Pin_5;
}
if (strEqu(pin, "6")) {
return GPIO_Pin_6;
}
if (strEqu(pin, "7")) {
return GPIO_Pin_7;
}
if (strEqu(pin, "8")) {
return GPIO_Pin_8;
}
if (strEqu(pin, "9")) {
return GPIO_Pin_9;
}
if (strEqu(pin, "10")) {
return GPIO_Pin_10;
}
if (strEqu(pin, "11")) {
return GPIO_Pin_11;
}
if (strEqu(pin, "12")) {
return GPIO_Pin_12;
}
if (strEqu(pin, "13")) {
return GPIO_Pin_13;
}
if (strEqu(pin, "14")) {
return GPIO_Pin_14;
}
if (strEqu(pin, "15")) {
return GPIO_Pin_15;
}
return 0;
}
GPIOMode_TypeDef get_GPIO_mode(char *mode){
if(strEqu(mode, "out")){
return GPIO_Mode_Out_PP;
}
if(strEqu(mode, "in")){
return GPIO_Mode_IN_FLOATING;
}
return GPIO_Mode_Out_PP;
}
uint32_t get_GPIO_Clock_group(char *pin){
if(strIsStartWith(pin, "PA")){
return RCC_APB2Periph_GPIOA;
}
if(strIsStartWith(pin, "PB")){
return RCC_APB2Periph_GPIOB;
}
if(strIsStartWith(pin, "PC")){
return RCC_APB2Periph_GPIOC;
}
if(strIsStartWith(pin, "PD")){
return RCC_APB2Periph_GPIOD;
}
return 0;
}
void CH32V103_GPIO_platformDisable(PikaObj *self){}
void CH32V103_GPIO_platformEnable(PikaObj *self){
char *pin = obj_getStr(self, "pin");
char *mode = obj_getStr(self, "mode");
GPIO_TypeDef *GPIO_group = get_GPIO_group(pin);
uint16_t GPIO_pin = get_GPIO_pin(pin);
GPIOMode_TypeDef GPIO_mode = get_GPIO_mode(mode);
uint32_t GPIO_clock_group = get_GPIO_Clock_group(pin);
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(GPIO_clock_group,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_mode;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_group, &GPIO_InitStructure);
}
void CH32V103_GPIO_platformHigh(PikaObj *self){
char *pin = obj_getStr(self, "pin");
GPIO_TypeDef *GPIO_group = get_GPIO_group(pin);
uint16_t GPIO_pin = get_GPIO_pin(pin);
GPIO_WriteBit(GPIO_group, GPIO_pin, Bit_SET);
}
void CH32V103_GPIO_platformLow(PikaObj *self){
char *pin = obj_getStr(self, "pin");
GPIO_TypeDef *GPIO_group = get_GPIO_group(pin);
uint16_t GPIO_pin = get_GPIO_pin(pin);
GPIO_WriteBit(GPIO_group, GPIO_pin, Bit_RESET);
}
void CH32V103_GPIO_platformSetMode(PikaObj *self){
char *mode = obj_getStr(self, "mode");
char *pin = obj_getStr(self, "pin");
GPIO_TypeDef *GPIO_group = get_GPIO_group(pin);
uint16_t GPIO_pin = get_GPIO_pin(pin);
GPIOMode_TypeDef GPIO_mode = get_GPIO_mode(mode);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_mode;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIO_group, &GPIO_InitStructure);
}