Advertisement
Guest User

Untitled

a guest
Sep 24th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
  2.  
  3. void startup ( void )
  4. {
  5. __asm volatile(
  6. " LDR R0,=0x2001C000\n" /* set stack */
  7. " MOV SP,R0\n"
  8. " BL main\n" /* call main */
  9. "_exit: B .\n" /* never return */
  10. ) ;
  11. }
  12.  
  13. #define EXTI_BASE (0x40013C00)
  14. #define EXTI_IMR ((volatile uint32_t *) (EXTI_BASE))
  15. #define EXTI_RTSR ((volatile uint32_t *) (EXTI_BASE + 8))
  16. #define EXTI_FTSR ((volatile uint32_t *) (EXTI_BASE + 0xC))
  17. #define EXTI_PR ((volatile uint32_t *) (EXTI_BASE + 0x14))
  18.  
  19. #define NVIC_ISER0 ((unsigned int *) 0xE000E100)
  20.  
  21. #define SCB_VTOR ((volatile unsigned int *) (0xE000ED08))
  22. #define SYSCFG_EXTICR1 0x40013808
  23.  
  24. void app_init (void);
  25. void irq_init (void);
  26. unsigned char keyb(void);
  27. void out7seg(unsigned char c);
  28. void systick_irq_handler(void);
  29. int measure_distance(void);
  30. void exti_1_handler(void);
  31. void systick_calls(void);
  32.  
  33. static volatile int unit = 58*10; // 58*centimeters
  34. static volatile int measure_delay = 100; // denotes how long delay in ms between distance measurement
  35. static volatile char irq_1_flag;
  36. static volatile char systick_flag;
  37. static volatile int delay_counter;
  38.  
  39. static volatile char measuring;
  40. static volatile int measuring_counter;
  41. static volatile int measuring_result;
  42.  
  43. #include "stm32f4xx.h"
  44. #include "stm32f4xx_rcc.h"
  45. #include "stm32f4xx_gpio.h"
  46.  
  47. void main(void){
  48. app_init();
  49. irq_1_flag = 0;
  50. char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x3D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
  51. //out7seg(segmap[1] + 0x80);
  52. irq_init();
  53. //out7seg(segmap[2] + 0x80);
  54. unsigned int distance;
  55. //out7seg(segmap[3] + 0x80);
  56. measure_distance();
  57. delay_1mikro();
  58. while(1){
  59. //out7seg(segmap[4] + 0x80);
  60. //distance = measure_distance();
  61. if(measuring == 0){
  62. if (measuring_result > 15){
  63. measuring_result = 15;
  64. }
  65. out7seg(segmap[measuring_result]);
  66.  
  67. delay_x_ms(measure_delay);
  68. measure_distance();
  69. }
  70. //out7seg(segmap[5] + 0x80);
  71. }
  72.  
  73.  
  74. }
  75.  
  76. //int measure_distance(void){
  77. void measure_distance(void){
  78. //int counter = 0;
  79. //int distance = 0;
  80. //char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
  81. GPIO_ResetBits(GPIOE,GPIO_Pin_0);
  82. delay_10mikro();
  83. GPIO_SetBits(GPIOE,GPIO_Pin_0);
  84. delay_10mikro();
  85. GPIO_ResetBits(GPIOE,GPIO_Pin_0);
  86. measuring = 1;
  87. measuring_counter = 0;
  88.  
  89. /*
  90. //while(~GPIO_ReadInputData(GPIOE) & 2){
  91. //}
  92. //while(GPIO_ReadInputData(GPIOE) & 2){
  93. while(irq_1_flag == 0){
  94. delay_1mikro();
  95. counter++;
  96. //out7seg(segmap[irq_1_flag] + 0x80);
  97. }
  98. //out7seg(segmap[2] + 0x80);
  99. irq_1_flag = 0;
  100. distance = counter/unit;
  101.  
  102. return distance;
  103. */
  104. }
  105.  
  106. void exti_1_handler(void){
  107. //out7seg(0x67 + 0x80);
  108. if(*EXTI_PR & 2){
  109. irq_1_flag = 1;
  110. *EXTI_PR |= 2;
  111. measuring = 0;
  112. measuring_result = measuring_counter / unit;
  113. }
  114. }
  115.  
  116. void delay_1mikro(void){
  117. SysTick->CTRL = 0;
  118. SysTick->LOAD = (168-1);
  119. SysTick->VAL = 0;
  120. //SysTick->CTRL = 5;
  121. SysTick->CTRL = 7;
  122.  
  123. // COUNTFLAG is a bit that is set to 1 when counter reaches 0.
  124. // It's automatically cleared when read.
  125. //while ((SysTick->CTRL & 0x10000) == 0);
  126.  
  127. /*
  128. while(systick_flag == 0){}
  129. systick_flag = 0;
  130. SysTick->CTRL = 0;
  131. */
  132. }
  133.  
  134. void delay_10mikro(void){
  135. for(int i = 0; i < 10; i++){
  136. delay_1mikro();
  137. }
  138. }
  139.  
  140. void delay_x_ms(int x){
  141. delay_counter = 0;
  142. while(delay_counter < (x*1000)){
  143.  
  144. }
  145. /*
  146. for(int i = 0; i < (x*1000); i++){
  147. delay_1mikro();
  148. }
  149. */
  150. }
  151.  
  152. void systick_calls(void){
  153. delay_counter++;
  154. if(measuring == 1){
  155. measuring_counter ++;
  156. }
  157. }
  158.  
  159. void app_init(void) {
  160.  
  161. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  162.  
  163. GPIO_InitTypeDef GPIOD_Out_InitDef;
  164.  
  165. GPIOD_Out_InitDef.GPIO_Pin = GPIO_Pin_All;
  166. GPIOD_Out_InitDef.GPIO_Mode = GPIO_Mode_OUT;
  167. GPIOD_Out_InitDef.GPIO_OType = GPIO_OType_PP;
  168. GPIOD_Out_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
  169. GPIOD_Out_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
  170. //Initialize pins
  171. GPIO_Init(GPIOD, &GPIOD_Out_InitDef);
  172.  
  173. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  174. GPIO_InitTypeDef GPIOE_Out_InitDef;
  175.  
  176. GPIOE_Out_InitDef.GPIO_Pin = GPIO_Pin_0;
  177. GPIOE_Out_InitDef.GPIO_Mode = GPIO_Mode_OUT;
  178. GPIOE_Out_InitDef.GPIO_OType = GPIO_OType_PP;
  179. GPIOE_Out_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
  180. GPIOE_Out_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
  181. //Initialize pins
  182. GPIO_Init(GPIOE, &GPIOE_Out_InitDef);
  183.  
  184. GPIO_InitTypeDef GPIOE_In_InitDef;
  185.  
  186. GPIOE_In_InitDef.GPIO_Pin = GPIO_Pin_1;
  187. GPIOE_In_InitDef.GPIO_Mode = GPIO_Mode_IN;
  188. GPIOE_In_InitDef.GPIO_OType = GPIO_OType_PP;
  189. GPIOE_In_InitDef.GPIO_PuPd = GPIO_PuPd_UP;
  190. GPIOE_In_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
  191. //Initialize pins
  192. GPIO_Init(GPIOE, &GPIOE_In_InitDef);
  193.  
  194. }
  195.  
  196. void systick_irq_handler(void){
  197. SysTick->CTRL = 0;
  198. //systick_flag = 1;
  199. delay_1mikro();
  200. systick_calls();
  201. }
  202.  
  203. void irq_init(void){
  204.  
  205. *((unsigned long *) 0x40023830) = 0x18;
  206. *((unsigned long *) 0x40023844) = 0x4000;
  207. *SCB_VTOR = 0x2001C000;
  208. *((void (**)(void) ) (*SCB_VTOR + 0x3C)) = systick_irq_handler;
  209. //*((void (**)(void) ) (*SCB_VTOR + 0x64)) = exti_3_handler;
  210. //*((void (**)(void) ) (*SCB_VTOR + 0x60)) = exti_2_handler;
  211. *((void (**)(void) ) (*SCB_VTOR + 0x5C)) = exti_1_handler;
  212. //*((void (**)(void) ) (*SCB_VTOR + 0x58)) = exti_0_handler;
  213.  
  214.  
  215. *((unsigned int *) SYSCFG_EXTICR1) &= ~0x00F0;
  216. *((unsigned int *) SYSCFG_EXTICR1) |= 0x0040;
  217.  
  218. *EXTI_IMR |= 2;
  219. *EXTI_FTSR |= 2;
  220. *EXTI_RTSR &= ~2;
  221.  
  222. *((unsigned int *) 0xE000E100) |= (0x80);
  223. }
  224.  
  225. void out7seg(unsigned char c) {
  226. GPIO_ResetBits(GPIOD, GPIO_Pin_All);
  227. GPIO_SetBits(GPIOD, c);
  228. //char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x3D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
  229. //GPIOD_ODR_LOW = c;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement