You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							65 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							65 lines
						
					
					
						
							1.6 KiB
						
					
					
				#define MODE_INPUT 0
 | 
						|
#define MODE_OUTPUT 1
 | 
						|
#define MODE_ALTERNATE 2
 | 
						|
#define MODE_ANALOG 3
 | 
						|
 | 
						|
#define PULL_NONE 0
 | 
						|
#define PULL_UP 1
 | 
						|
#define PULL_DOWN 2
 | 
						|
 | 
						|
#define OUTPUT_TYPE_PUSH_PULL 0U
 | 
						|
#define OUTPUT_TYPE_OPEN_DRAIN 1U
 | 
						|
 | 
						|
void set_gpio_mode(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) {
 | 
						|
  ENTER_CRITICAL();
 | 
						|
  uint32_t tmp = GPIO->MODER;
 | 
						|
  tmp &= ~(3U << (pin * 2U));
 | 
						|
  tmp |= (mode << (pin * 2U));
 | 
						|
  GPIO->MODER = tmp;
 | 
						|
  EXIT_CRITICAL();
 | 
						|
}
 | 
						|
 | 
						|
void set_gpio_output(GPIO_TypeDef *GPIO, unsigned int pin, bool enabled) {
 | 
						|
  ENTER_CRITICAL();
 | 
						|
  if (enabled) {
 | 
						|
    GPIO->ODR |= (1U << pin);
 | 
						|
  } else {
 | 
						|
    GPIO->ODR &= ~(1U << pin);
 | 
						|
  }
 | 
						|
  set_gpio_mode(GPIO, pin, MODE_OUTPUT);
 | 
						|
  EXIT_CRITICAL();
 | 
						|
}
 | 
						|
 | 
						|
void set_gpio_output_type(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int output_type){
 | 
						|
  ENTER_CRITICAL();
 | 
						|
  if(output_type == OUTPUT_TYPE_OPEN_DRAIN) {
 | 
						|
    GPIO->OTYPER |= (1U << pin);
 | 
						|
  } else {
 | 
						|
    GPIO->OTYPER &= ~(1U << pin);
 | 
						|
  }
 | 
						|
  EXIT_CRITICAL();
 | 
						|
}
 | 
						|
 | 
						|
void set_gpio_alternate(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) {
 | 
						|
  ENTER_CRITICAL();
 | 
						|
  uint32_t tmp = GPIO->AFR[pin >> 3U];
 | 
						|
  tmp &= ~(0xFU << ((pin & 7U) * 4U));
 | 
						|
  tmp |= mode << ((pin & 7U) * 4U);
 | 
						|
  GPIO->AFR[pin >> 3] = tmp;
 | 
						|
  set_gpio_mode(GPIO, pin, MODE_ALTERNATE);
 | 
						|
  EXIT_CRITICAL();
 | 
						|
}
 | 
						|
 | 
						|
void set_gpio_pullup(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) {
 | 
						|
  ENTER_CRITICAL();
 | 
						|
  uint32_t tmp = GPIO->PUPDR;
 | 
						|
  tmp &= ~(3U << (pin * 2U));
 | 
						|
  tmp |= (mode << (pin * 2U));
 | 
						|
  GPIO->PUPDR = tmp;
 | 
						|
  EXIT_CRITICAL();
 | 
						|
}
 | 
						|
 | 
						|
int get_gpio_input(GPIO_TypeDef *GPIO, unsigned int pin) {
 | 
						|
  return (GPIO->IDR & (1U << pin)) == (1U << pin);
 | 
						|
}
 | 
						|
 | 
						|
 |