Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
gpio.c@0:34ee385f4d2d, 2021-10-23 (annotated)
- Committer:
- rajathr
- Date:
- Sat Oct 23 05:49:09 2021 +0000
- Revision:
- 0:34ee385f4d2d
At 23rd Oct 21 - All Code
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| rajathr | 0:34ee385f4d2d | 1 | #include "gpio.h" |
| rajathr | 0:34ee385f4d2d | 2 | #include "main_Lec9.h" |
| rajathr | 0:34ee385f4d2d | 3 | #include "stm32f4xx_rcc_mort.h" |
| rajathr | 0:34ee385f4d2d | 4 | |
| rajathr | 0:34ee385f4d2d | 5 | |
| rajathr | 0:34ee385f4d2d | 6 | /* Below are defined Address of Port B and corresponding registers*/ |
| rajathr | 0:34ee385f4d2d | 7 | #define PORTB_BASE_ADDRESS ((uint32_t)0x40020400) |
| rajathr | 0:34ee385f4d2d | 8 | #define PORTB_MODER_REGISTER (PORTB_BASE_ADDRESS + 0x00) |
| rajathr | 0:34ee385f4d2d | 9 | #define PORTB_OTYPER_REGISTER (PORTB_BASE_ADDRESS + 0x04) |
| rajathr | 0:34ee385f4d2d | 10 | #define PORTB_OSPEEDR_REGISTER (PORTB_BASE_ADDRESS + 0x08) |
| rajathr | 0:34ee385f4d2d | 11 | #define PORTB_PUPDR_REGISTER (PORTB_BASE_ADDRESS + 0x0C) |
| rajathr | 0:34ee385f4d2d | 12 | #define PORTB_IDR_REGISTER (PORTB_BASE_ADDRESS + 0x10) |
| rajathr | 0:34ee385f4d2d | 13 | #define PORTB_ODR_REGISTER (PORTB_BASE_ADDRESS + 0x14) |
| rajathr | 0:34ee385f4d2d | 14 | #define PORTB_AFR1_REGISTER (PORTB_BASE_ADDRESS + 0x20) |
| rajathr | 0:34ee385f4d2d | 15 | |
| rajathr | 0:34ee385f4d2d | 16 | /* Below are defined Address of Port C and corresponding registers*/ |
| rajathr | 0:34ee385f4d2d | 17 | #define PORTC_BASE_ADDRESS ((uint32_t)0x40020800) |
| rajathr | 0:34ee385f4d2d | 18 | #define PORTC_MODER_REGISTER (PORTC_BASE_ADDRESS + 0x00) |
| rajathr | 0:34ee385f4d2d | 19 | #define PORTC_OTYPER_REGISTER (PORTC_BASE_ADDRESS + 0x04) |
| rajathr | 0:34ee385f4d2d | 20 | #define PORTC_OSPEEDR_REGISTER (PORTC_BASE_ADDRESS + 0x08) |
| rajathr | 0:34ee385f4d2d | 21 | #define PORTC_PUPDR_REGISTER (PORTC_BASE_ADDRESS + 0x0C) |
| rajathr | 0:34ee385f4d2d | 22 | #define PORTC_IDR_REGISTER (PORTC_BASE_ADDRESS + 0x10) |
| rajathr | 0:34ee385f4d2d | 23 | #define PORTC_ODR_REGISTER (PORTC_BASE_ADDRESS + 0x14) |
| rajathr | 0:34ee385f4d2d | 24 | #define PORTC_AFR1_REGISTER (PORTC_BASE_ADDRESS + 0x20) |
| rajathr | 0:34ee385f4d2d | 25 | |
| rajathr | 0:34ee385f4d2d | 26 | void InitPortBPin0asOutput(void) |
| rajathr | 0:34ee385f4d2d | 27 | { |
| rajathr | 0:34ee385f4d2d | 28 | uint32_t *reg; /*Define Pointer*/ |
| rajathr | 0:34ee385f4d2d | 29 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Enable the clock */ |
| rajathr | 0:34ee385f4d2d | 30 | |
| rajathr | 0:34ee385f4d2d | 31 | reg = (uint32_t *)PORTB_MODER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 32 | *reg = *reg & (~((uint32_t)0x03)); /*Clear last two bits of Moder Register*/ |
| rajathr | 0:34ee385f4d2d | 33 | *reg = *reg | ((uint32_t)0x01); /* Set the last two pins corresponding to Pin0 as Output Mode - 01 */ |
| rajathr | 0:34ee385f4d2d | 34 | |
| rajathr | 0:34ee385f4d2d | 35 | reg = (uint32_t *)PORTB_OTYPER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 36 | *reg = *reg & (~((uint32_t)0x01)); /* Clear the last bit of OTYPER REGISTER*/ |
| rajathr | 0:34ee385f4d2d | 37 | *reg = *reg | ((uint32_t)0x00);/*Statement is to set the OTYPER REGISTER TO 0 - Push Pull Type*/ |
| rajathr | 0:34ee385f4d2d | 38 | |
| rajathr | 0:34ee385f4d2d | 39 | reg = (uint32_t *)PORTB_PUPDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 40 | *reg = *reg & (~((uint32_t)0x03)); /* Clear the last two bits of PUPDR REGISTER*/ |
| rajathr | 0:34ee385f4d2d | 41 | *reg = *reg | ((uint32_t)0x00);/*Statement is to set the PUPDR REGISTER TO 00 - No Pull Up No Pull Down Type*/ |
| rajathr | 0:34ee385f4d2d | 42 | |
| rajathr | 0:34ee385f4d2d | 43 | //reg=(uint32_t *)PORTB_OSPEEDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 44 | //*reg=*reg&(~((uint32_t)0x11)); /* Clear the last two bits of OSPEEDR REGISTER*/ |
| rajathr | 0:34ee385f4d2d | 45 | //*reg=*reg|((uint32_t)0x11); /* Set the last two bits of OSPEEDR REGISTER to High Speed*/ |
| rajathr | 0:34ee385f4d2d | 46 | |
| rajathr | 0:34ee385f4d2d | 47 | reg = (uint32_t *)PORTB_ODR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 48 | *reg = *reg | ((uint32_t)0x01); /* Setting the ODR REGISTER TO HIGH TO START WITH - Last bit is 1*/ |
| rajathr | 0:34ee385f4d2d | 49 | } |
| rajathr | 0:34ee385f4d2d | 50 | |
| rajathr | 0:34ee385f4d2d | 51 | |
| rajathr | 0:34ee385f4d2d | 52 | |
| rajathr | 0:34ee385f4d2d | 53 | void toggleGPIOB0(void) |
| rajathr | 0:34ee385f4d2d | 54 | { |
| rajathr | 0:34ee385f4d2d | 55 | uint32_t value; |
| rajathr | 0:34ee385f4d2d | 56 | uint32_t *reg; /* Defining the variables*/ |
| rajathr | 0:34ee385f4d2d | 57 | |
| rajathr | 0:34ee385f4d2d | 58 | reg = (uint32_t *)PORTB_ODR_REGISTER; /*Initializing the current value of ODR REGISTER*/ |
| rajathr | 0:34ee385f4d2d | 59 | value = *reg & ((uint32_t)0x1); /* Reading the value of last bit of current ODR REGISTER - Stored in reg*/ |
| rajathr | 0:34ee385f4d2d | 60 | |
| rajathr | 0:34ee385f4d2d | 61 | if (value > 0) |
| rajathr | 0:34ee385f4d2d | 62 | { |
| rajathr | 0:34ee385f4d2d | 63 | /* The bit is high initially*/ |
| rajathr | 0:34ee385f4d2d | 64 | /*Need to set it to low now*/ |
| rajathr | 0:34ee385f4d2d | 65 | *reg = *reg & (~((uint32_t)0x1)); |
| rajathr | 0:34ee385f4d2d | 66 | } |
| rajathr | 0:34ee385f4d2d | 67 | |
| rajathr | 0:34ee385f4d2d | 68 | else |
| rajathr | 0:34ee385f4d2d | 69 | { |
| rajathr | 0:34ee385f4d2d | 70 | /* The bit is low initially*/ |
| rajathr | 0:34ee385f4d2d | 71 | /* Need to set it to high now*/ |
| rajathr | 0:34ee385f4d2d | 72 | *reg = *reg | ((uint32_t)0x01); |
| rajathr | 0:34ee385f4d2d | 73 | } |
| rajathr | 0:34ee385f4d2d | 74 | } |
| rajathr | 0:34ee385f4d2d | 75 | |
| rajathr | 0:34ee385f4d2d | 76 | |
| rajathr | 0:34ee385f4d2d | 77 | |
| rajathr | 0:34ee385f4d2d | 78 | |
| rajathr | 0:34ee385f4d2d | 79 | void InitGPIOBPin0asOutputCompare(void) |
| rajathr | 0:34ee385f4d2d | 80 | { |
| rajathr | 0:34ee385f4d2d | 81 | uint32_t *reg; //Initialize register pointer variable |
| rajathr | 0:34ee385f4d2d | 82 | |
| rajathr | 0:34ee385f4d2d | 83 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Enable the clock */ |
| rajathr | 0:34ee385f4d2d | 84 | |
| rajathr | 0:34ee385f4d2d | 85 | reg = (uint32_t *)PORTB_MODER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 86 | *reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 87 | *reg = *reg | ((uint32_t)0b10); //Write 10 to last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 88 | |
| rajathr | 0:34ee385f4d2d | 89 | reg = (uint32_t *)PORTB_OTYPER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 90 | *reg = *reg & (~((uint32_t)0x01)); //Clear last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 91 | *reg = *reg | ((uint32_t)0x00); //Setting 0 to last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 92 | |
| rajathr | 0:34ee385f4d2d | 93 | reg = (uint32_t *)PORTB_PUPDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 94 | *reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of PUPDR REGISTER - NO PULL UP/DOWN |
| rajathr | 0:34ee385f4d2d | 95 | |
| rajathr | 0:34ee385f4d2d | 96 | //reg = (uint32_t *)PORTB_OSPEEDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 97 | //*reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of OSPEEDR REGISTER |
| rajathr | 0:34ee385f4d2d | 98 | //*reg = *reg | ((uint32_t)0x03); //Setting of 11 to last two bits of OSPEEDR REGISTER - HIGH SPEED |
| rajathr | 0:34ee385f4d2d | 99 | |
| rajathr | 0:34ee385f4d2d | 100 | reg = (uint32_t *)PORTB_AFR1_REGISTER; |
| rajathr | 0:34ee385f4d2d | 101 | *reg = *reg & (~((uint32_t)0xF)); //Clear last four bits of AFRL0 - GPIOB_AFRL REGISTER |
| rajathr | 0:34ee385f4d2d | 102 | *reg=*reg|((uint32_t)0x2); //Set last four digits of AFRL0 to 0010 - AF2 Alternate Function |
| rajathr | 0:34ee385f4d2d | 103 | } |
| rajathr | 0:34ee385f4d2d | 104 | |
| rajathr | 0:34ee385f4d2d | 105 | |
| rajathr | 0:34ee385f4d2d | 106 | |
| rajathr | 0:34ee385f4d2d | 107 | void InitGPIOCPin6asInputCapture(void) |
| rajathr | 0:34ee385f4d2d | 108 | { |
| rajathr | 0:34ee385f4d2d | 109 | uint32_t *reg; //Initialize register pointer variable |
| rajathr | 0:34ee385f4d2d | 110 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); /* Enable the clock */ |
| rajathr | 0:34ee385f4d2d | 111 | |
| rajathr | 0:34ee385f4d2d | 112 | reg = (uint32_t *)PORTC_MODER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 113 | *reg = *reg & (~((uint32_t)0x3000)); //Clear last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 114 | *reg = *reg | ((uint32_t)0x2000); //Write 10 to last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 115 | |
| rajathr | 0:34ee385f4d2d | 116 | reg = (uint32_t *)PORTC_OTYPER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 117 | *reg = *reg & (~((uint32_t)0x40)); //Clear last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 118 | *reg = *reg | ((uint32_t)0x00); //Setting 0 to last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 119 | |
| rajathr | 0:34ee385f4d2d | 120 | reg = (uint32_t *)PORTC_OSPEEDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 121 | *reg = *reg & (~((uint32_t)0x3000)); //Clear last two bits of OSPEEDR REGISTER |
| rajathr | 0:34ee385f4d2d | 122 | *reg = *reg | ((uint32_t)0x3000); //Setting of 11 to last two bits of OSPEEDR REGISTER - HIGH SPEED |
| rajathr | 0:34ee385f4d2d | 123 | |
| rajathr | 0:34ee385f4d2d | 124 | reg = (uint32_t *)PORTC_PUPDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 125 | *reg = *reg & (~((uint32_t)0x3000)); //Clear last two bits of PUPDR REGISTER - NO PULL UP/DOWN |
| rajathr | 0:34ee385f4d2d | 126 | *reg = *reg | 0x00; //Setting two bits of PUPDR REGISTER - NO PULL UP/DOWN |
| rajathr | 0:34ee385f4d2d | 127 | |
| rajathr | 0:34ee385f4d2d | 128 | reg = (uint32_t *)PORTC_AFR1_REGISTER; |
| rajathr | 0:34ee385f4d2d | 129 | *reg= *reg & (~((uint32_t)0xF000000)); //Clear last four bits of AFRL0 - GPIOB_AFRL REGISTER |
| rajathr | 0:34ee385f4d2d | 130 | *reg= *reg | ((uint32_t)0x2000000); //Set last four digits of AFRL0 to 0010 - AF2 Alternate Function |
| rajathr | 0:34ee385f4d2d | 131 | } |
| rajathr | 0:34ee385f4d2d | 132 | |
| rajathr | 0:34ee385f4d2d | 133 | void InitGPIOBPin0asPWMMode1(void) |
| rajathr | 0:34ee385f4d2d | 134 | { |
| rajathr | 0:34ee385f4d2d | 135 | uint32_t *reg; //Initialize register pointer variable |
| rajathr | 0:34ee385f4d2d | 136 | |
| rajathr | 0:34ee385f4d2d | 137 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Enable the clock */ |
| rajathr | 0:34ee385f4d2d | 138 | |
| rajathr | 0:34ee385f4d2d | 139 | reg = (uint32_t *)PORTB_MODER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 140 | *reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 141 | *reg = *reg | ((uint32_t)0b10); //Write 10 to last two bits of MODER REGISTER |
| rajathr | 0:34ee385f4d2d | 142 | |
| rajathr | 0:34ee385f4d2d | 143 | reg = (uint32_t *)PORTB_OTYPER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 144 | *reg = *reg & (~((uint32_t)0x01)); //Clear last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 145 | *reg = *reg | ((uint32_t)0x00); //Setting 0 to last bit of OTYPER REGISTER |
| rajathr | 0:34ee385f4d2d | 146 | |
| rajathr | 0:34ee385f4d2d | 147 | reg = (uint32_t *)PORTB_PUPDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 148 | *reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of PUPDR REGISTER - NO PULL UP/DOWN |
| rajathr | 0:34ee385f4d2d | 149 | |
| rajathr | 0:34ee385f4d2d | 150 | reg = (uint32_t *)PORTB_OSPEEDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 151 | *reg = *reg & (~((uint32_t)0x03)); //Clear last two bits of OSPEEDR REGISTER |
| rajathr | 0:34ee385f4d2d | 152 | *reg = *reg | ((uint32_t)0x03); //Setting of 11 to last two bits of OSPEEDR REGISTER - HIGH SPEED |
| rajathr | 0:34ee385f4d2d | 153 | |
| rajathr | 0:34ee385f4d2d | 154 | reg = (uint32_t *)PORTB_AFR1_REGISTER; |
| rajathr | 0:34ee385f4d2d | 155 | *reg = *reg & (~((uint32_t)0xF)); //Clear last four bits of AFRL0 - GPIOB_AFRL REGISTER |
| rajathr | 0:34ee385f4d2d | 156 | *reg=*reg|((uint32_t)0x2); //Set last four digits of AFRL0 to 0010 - AF2 Alternate Function |
| rajathr | 0:34ee385f4d2d | 157 | } |
| rajathr | 0:34ee385f4d2d | 158 | |
| rajathr | 0:34ee385f4d2d | 159 | void setGPIOB0( void ) |
| rajathr | 0:34ee385f4d2d | 160 | { |
| rajathr | 0:34ee385f4d2d | 161 | uint32_t * reg; |
| rajathr | 0:34ee385f4d2d | 162 | reg = (uint32_t *)PORTB_ODR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 163 | *reg = *reg | 0b01; |
| rajathr | 0:34ee385f4d2d | 164 | } |
| rajathr | 0:34ee385f4d2d | 165 | |
| rajathr | 0:34ee385f4d2d | 166 | void clearGPIOB0( void ) |
| rajathr | 0:34ee385f4d2d | 167 | { |
| rajathr | 0:34ee385f4d2d | 168 | uint32_t * reg; |
| rajathr | 0:34ee385f4d2d | 169 | reg = (uint32_t *)PORTB_ODR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 170 | *reg = *reg & (~(uint32_t)0b01); |
| rajathr | 0:34ee385f4d2d | 171 | } |
| rajathr | 0:34ee385f4d2d | 172 | |
| rajathr | 0:34ee385f4d2d | 173 | void initGpioC6AsInput( void ) |
| rajathr | 0:34ee385f4d2d | 174 | { |
| rajathr | 0:34ee385f4d2d | 175 | uint32_t * reg; |
| rajathr | 0:34ee385f4d2d | 176 | /* GPIOC Peripheral clock enable */ |
| rajathr | 0:34ee385f4d2d | 177 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); |
| rajathr | 0:34ee385f4d2d | 178 | /* GPIOC Pin 6 as input*/ |
| rajathr | 0:34ee385f4d2d | 179 | reg = (uint32_t *)PORTC_MODER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 180 | *reg = *reg & (~((uint32_t)0x3000)); |
| rajathr | 0:34ee385f4d2d | 181 | *reg= *reg | 0x0000; |
| rajathr | 0:34ee385f4d2d | 182 | /*PUSH-PULL Pin*/ |
| rajathr | 0:34ee385f4d2d | 183 | reg = (uint32_t *)PORTC_OTYPER_REGISTER; |
| rajathr | 0:34ee385f4d2d | 184 | *reg = *reg & (~((uint32_t)0x40)); |
| rajathr | 0:34ee385f4d2d | 185 | *reg = *reg | 0x00; |
| rajathr | 0:34ee385f4d2d | 186 | /*GPIOC pin 6 high speed */ |
| rajathr | 0:34ee385f4d2d | 187 | reg = (uint32_t *)PORTC_OSPEEDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 188 | *reg= *reg| 0x3000; |
| rajathr | 0:34ee385f4d2d | 189 | /*Configure pulled-down*/ |
| rajathr | 0:34ee385f4d2d | 190 | reg = (uint32_t *)PORTC_PUPDR_REGISTER; |
| rajathr | 0:34ee385f4d2d | 191 | *reg = *reg & (~((uint32_t)0x3000)); |
| rajathr | 0:34ee385f4d2d | 192 | *reg= *reg | 0x2000; |
| rajathr | 0:34ee385f4d2d | 193 | } |
| rajathr | 0:34ee385f4d2d | 194 |