sir i am facing a problem to map my inputs and outputs in the if condition that is in read input data bit for multiple pins kindly help me the same.
#include "stm32f0xx.h" #include "stm32f0308_Discovery.h"
#define out0 GPIO_Pin_0 #define out1 GPIO_Pin_1 #define out2 GPIO_Pin_2 #define out3 GPIO_Pin_3 #define out4 GPIO_Pin_4 #define out_GPIO GPIOC
void TM_Delay_Init(void); void TM_DelayMillis(uint32_t millis); void TM_DelayMillis1(uint32_t millis); void TM_DelayMillis2(uint32_t millis);
GPIO_InitTypeDef GPIO_InitStructure ;
uint32_t multiplier;
int main(void) { SystemInit(); SystemCoreClockUpdate(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOC, ENABLE); /* Configure PA in input mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /*configure PC in output mode */ GPIOC->MODER |= ((GPIO_MODER_MODER0_0)|(GPIO_MODER_MODER1_0)|(GPIO_MODER_MODER2_0)|(GPIO_MODER_MODER3_0)|(GPIO_MODER_MODER4_0)|(GPIO_MODER_MODER5_0)) ; //GPIOC-> GPIO_MODER_MODER8_0 = 0x01; GPIOC->OTYPER &= ~((GPIO_OTYPER_OT_0)|(GPIO_OTYPER_OT_1)|(GPIO_OTYPER_OT_2)|(GPIO_OTYPER_OT_3)|(GPIO_OTYPER_OT_4)|(GPIO_OTYPER_OT_5)) ; //GPIOC->OTYPER = 0x00; GPIOC->OSPEEDR |= ((GPIO_OSPEEDER_OSPEEDR0)|(GPIO_OSPEEDER_OSPEEDR1)|(GPIO_OSPEEDER_OSPEEDR2)|(GPIO_OSPEEDER_OSPEEDR3)|(GPIO_OSPEEDER_OSPEEDR4)|(GPIO_OSPEEDER_OSPEEDR5)); //GPIOC->OSPEEDR = 0x00; GPIOC->PUPDR &= ~((GPIO_PUPDR_PUPDR0)|(GPIO_PUPDR_PUPDR1)|(GPIO_PUPDR_PUPDR2)|(GPIO_PUPDR_PUPDR3)|(GPIO_PUPDR_PUPDR4)|(GPIO_PUPDR_PUPDR5)); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1) { GPIO_SetBits(GPIOC,(out0)|(out1)|(out2)|(out3)|(out4)); TM_DelayMillis(7); GPIO_ResetBits(GPIOC,(out0)|(out1)|(out2)|(out3)|(out4)); while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1) { GPIO_SetBits(GPIOC,(out0)|(out1)|(out2)|(out3)|(out4)); TM_DelayMillis1(3); GPIO_ResetBits(GPIOC,(out0)|(out1)|(out2)|(out3)|(out4)); TM_DelayMillis2(22); } } } }
void TM_DelayMillis(uint32_t millis) { /* Multiply millis with multipler */ /* Substract 10 */ millis = 100 * millis * multiplier - 10; /* 4 cycles for one loop */ while (millis--); }
void TM_DelayMillis1(uint32_t millis) { /* Multiply millis with multipler */ /* Substract 10 */ millis = 1 * millis * multiplier - 10; /* 4 cycles for one loop */ while (millis--); }
void TM_DelayMillis2(uint32_t millis) { /* Multiply millis with multipler */ /* Substract 10 */ millis = 1 * millis * multiplier - 10; /* 4 cycles for one loop */ while (millis--); }
void TM_Delay_Init(void) { RCC_ClocksTypeDef RCC_Clocks;
/* Get system clocks */ RCC_GetClocksFreq(&RCC_Clocks);
/* While loop takes 4 cycles */ /* For 1 us delay, we need to divide with 4M */ multiplier = RCC_Clocks.HCLK_Frequency / 4000000; }
Draw a diagram, your explanation and source really lacks any amount of clarity.
http://www.keil.com/forum/60329/
I think that the following condition:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1
will be false since it looks like you reset the output 0. If that is correct then GPIO_PIN_0 will be 0 and will stay zero in the while loop.
Sorry. I guess you are trying to control the while loop with a GPIO_A input pin
Perhaps you could extend your delays longer and add additional delay right before the second while.
thank you sir for responding in a good way sir i want to check the condition of my input pins in if condition and also in the while condition such that when i make high a single pin my output should be high but not the other pins kindly help me in this as i am not able to get it
You're certainly not able to explain it well. Is there more than one input, like your previous question, or is this something else?
I'll wait for the diagram. It should show the input pin(s), and the expected output states. Also the purpose and timing of any delays. May be you could express this as a table.
Perhaps you can present the question as it was originally presented to you as homework or a project? May be you work with someone who can better explain the requirements. Perhaps your teacher/manager can provide additional support?
You can read multiple pin states via the GPIOx->IDR register, and the outputs via GPIOx->ODR
This sounds like the identical problem one of your class mates asked not too long ago.
Why not cheat together with him/her to leave less traces of the cheating for the teacher to locate?
View all questions in Keil forum