Pin implementation is semi finished TODO : test speed() and ouputputstate() and lasty define printinfo() and error() functions implementations

interrupts
key 4 years ago
parent e9dea25879
commit 76c339af27

@ -110,21 +110,21 @@ typedef enum
NotGpio NotGpio
}errors; }errors;
void setMode(pinNo_t pinNo, mode mode); void pinSetMode(pinNo_t pinNo, mode mode);
void setOutputState(pinNo_t pinNo, state state); void pinSetOutputState(pinNo_t pinNo, state state);
void setPullUpDonw(pinNo_t pinNo, pullUpDown resistance); void pinSetPullUpDonw(pinNo_t pinNo, pullUpDown resistance);
void setSpeed(pinNo_t pinNo, speed speed); void pinSetSpeed(pinNo_t pinNo, speed speed);
void config(pinNo_t pinNo, mode mode, state state, pullUpDown resistance, speed speed); void pinConfig(pinNo_t pinNo, mode mode, state state, pullUpDown resistance, speed speed);
uint8_t get(pinNo_t pinNo); uint8_t pinRead(pinNo_t pinNo);
void toggle(pinNo_t pinNo); void pinToggle(pinNo_t pinNo);
void set(pinNo_t pinNo, uint8_t state); void pinWrite(pinNo_t pinNo, uint8_t state);
void init(pinNo_t pinNo); void pinInit(pinNo_t pinNo);
void deInit(pinNo_t pinNo); void pinDeInit(pinNo_t pinNo);
void hardwareInfo(pinNo_t pinNo); void pinHardwareInfo(pinNo_t pinNo);
void throwError(); void pinThrowError();
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -13,6 +13,9 @@
#define PUPDR_PULL_UP 0x1UL #define PUPDR_PULL_UP 0x1UL
#define PUPDR_PULL_DOWN 0x2UL #define PUPDR_PULL_DOWN 0x2UL
#define OTYPER_PUSH_PULL 0x0UL
#define OTYPER_OPEN_DRAIN 0x1UL
#define PIN_BASE ((GPIO_TypeDef *)(pinNo&~0xFF)) #define PIN_BASE ((GPIO_TypeDef *)(pinNo&~0xFF))
const uint32_t moderMode[5] = { const uint32_t moderMode[5] = {
@ -36,63 +39,70 @@ const uint32_t pinPullUpDown[3] = {
}; };
const uint32_t speedList[4] = { const uint32_t speedList[4] = {
0, OSPEEDR_LOW,
0, OSPEEDR_LOW,
1, OSPEEDR_MEDIUM,
3 OSPEEDR_HIGH
}; };
const uint32_t outputStateList[3] = const uint32_t outputStateList[3] =
{ {
1, OTYPER_OPEN_DRAIN,
0, OTYPER_PUSH_PULL,
1 OTYPER_OPEN_DRAIN
}; };
void setMode(pinNo_t pinNo, mode mode) void pinSetMode(pinNo_t pinNo, mode mode)
{ {
init(pinNo);
//Clear entry. //Clear entry.
PIN_BASE->MODER &=~ (0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->MODER &=~ (0x3 << ((pinNo & 0x0F) * 2));
//Set to corresponding mode. //Set to corresponding mode.
PIN_BASE->MODER |= (moderMode[mode] << ((pinNo & 0x0F) * 2)); PIN_BASE->MODER |= (moderMode[mode] << ((pinNo & 0x0F) * 2));
} }
void setOutputState(pinNo_t pinNo, state state) void pinSetOutputState(pinNo_t pinNo, state state)
{ {
PIN_BASE->OSPEEDR &= 1 << (pinNo & 0x0F); PIN_BASE->OSPEEDR &= 1 << (pinNo & 0x0F);
PIN_BASE->OSPEEDR |= (outputStateList[state] << (pinNo & 0x0F)); PIN_BASE->OSPEEDR |= (outputStateList[state] << (pinNo & 0x0F));
} }
void setPullUpDonw(pinNo_t pinNo, pullUpDown resistance) void pinSetPullUpDonw(pinNo_t pinNo, pullUpDown resistance)
{ {
PIN_BASE->PUPDR &= ~(0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->PUPDR &= ~(0x3 << ((pinNo & 0x0F) * 2));
PIN_BASE->PUPDR |= (pinPullUpDown[resistance] << ((pinNo & 0x0F) * 2)); PIN_BASE->PUPDR |= (pinPullUpDown[resistance] << ((pinNo & 0x0F) * 2));
} }
void setSpeed(pinNo_t pinNo, speed speed) void pinSetSpeed(pinNo_t pinNo, speed speed)
{ {
PIN_BASE->OSPEEDR &= (0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->OSPEEDR &= (0x3 << ((pinNo & 0x0F) * 2));
PIN_BASE->OSPEEDR |= (speedList[speed] << ((pinNo & 0x0F) * 2)); PIN_BASE->OSPEEDR |= (speedList[speed] << ((pinNo & 0x0F) * 2));
} }
void config(pinNo_t pinNo, mode mode, state state, pullUpDown resistance, speed speed) void pinConfig(pinNo_t pinNo, mode mode, state state, pullUpDown resistance, speed speed)
{ {
pinSetMode(pinNo, mode);
pinSetOutputState(pinNo, state);
pinSetPullUpDonw(pinNo, resistance);
pinSetSpeed(pinNo,speed);
pinInit(pinNo);
} }
uint8_t get(pinNo_t pinNo) uint8_t pinRead(pinNo_t pinNo)
{ {
return ((PIN_BASE->IDR & (1<<(pinNo & 0x0F))) >> (pinNo & 0x0F));
} }
void toggle(pinNo_t pinNo) void pinToggle(pinNo_t pinNo)
{ {
if(pinRead(pinNo))
{
PIN_BASE->BSRR |= (GPIO_BSRR_BR_0 << ((pinNo & 0xF)));
return;
}
PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF)));
} }
void set(pinNo_t pinNo, uint8_t state) void pinWrite(pinNo_t pinNo, uint8_t state)
{ {
if(state) { if(state) {
PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF))); PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF)));
@ -102,25 +112,31 @@ void set(pinNo_t pinNo, uint8_t state)
} }
//Enable the pin port's clock //Enable the pin port's clock
void init(pinNo_t pinNo) //in this family of MCU ell the cloks are on the same bus that is why we dion't need to
//modfify the AHBENR.
//DS Page : 121
void pinInit(pinNo_t pinNo)
{ {
RCC->AHBENR |= pinPort[((pinNo & 0xF0)>>4)]; RCC->AHBENR |= pinPort[((pinNo & 0xF0)>>4)];
} }
void deInit(pinNo_t pinNo) //in this family of MCU ell the cloks are on the same bus that is why we dion't need to
//modfify the AHBENR.
//DS Page : 121
void pinDeInit(pinNo_t pinNo)
{ {
RCC->AHBENR &=~(pinPort[((pinNo & 0xF0)>>4)]);
} }
void hardwareInfo(pinNo_t pinNo) void pinHardwareInfo(pinNo_t pinNo)
{ {
//TODO : define where to print anh woh to print
} }
void throwError() void pinThrowError()
{ {
//TODO : Define what for an error di we whant to implement
} }

@ -4,20 +4,38 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
Delay delay; Delay delay;
stmStart();
setMode(pinB3,output); uint8_t i = 0;
stmStart();
while(1) pinConfig(pinB3, output, pushPull, none, normal);
{ pinConfig(pinA0, input, pushPull, pullDown, normal);
set(pinB3,1);
for(i = 0 ; i < 10 ; i++)
{
delay.ms(100); delay.ms(100);
set(pinB3,0); pinToggle(pinB3);
delay.ms(100); delay.ms(100);
} }
pinWrite(pinB3,0);
while(1)
{
if(pinRead(pinA0))
{
pinWrite(pinB3,1);
}
else
{
pinWrite(pinB3,0);
}
}
return 1; return 1;
} }

Loading…
Cancel
Save