Advertisement
Guest User

Untitled

a guest
Dec 25th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 6.66 KB | None | 0 0
  1. #include "stm32f10x.h"
  2. #define DELAY_VAL 1000
  3.  
  4. void delay(uint32_t takts);
  5. void setnumber(uint16_t i);
  6. void initButtons(void);
  7. void initOutputPorts(void);
  8. void initTIM6(void);
  9. void delay(uint32_t takts);
  10.  
  11. uint16_t seg = 1;
  12. uint16_t i ;
  13. uint16_t current = 0x0;
  14.  
  15. void setnumber(uint16_t i){
  16.    
  17.     switch(i){
  18.             case 0:
  19.                     GPIOA->ODR = 0x7E;
  20.                     current = 0x0;
  21.                     break;
  22.             case 1:
  23.                     GPIOA->ODR = 0x30;
  24.                     current = 0x01;
  25.                     break;
  26.             case 2:
  27.                     GPIOA->ODR = 0x6D;
  28.                     current = 0x02;
  29.                     break;
  30.             case 3:
  31.                     GPIOA->ODR = 0x79;
  32.                     current = 0x03;
  33.                     break;
  34.             case 4:
  35.                     GPIOA->ODR = 0x33;
  36.                     current = 0x04;
  37.                     break;
  38.             case 5:
  39.                     GPIOA->ODR = 0x5B;
  40.                     current = 0x05;
  41.                     break;
  42.             case 6:
  43.                     GPIOA->ODR = 0x5F;
  44.                     current = 0x06;
  45.                     break;
  46.             case 7:
  47.                     GPIOA->ODR = 0x70;
  48.                     current = 0x07;
  49.                     break;
  50.             case 8:
  51.                     GPIOA->ODR = 0x7F;
  52.                     current = 0x08;
  53.                     break;
  54.             case 9:
  55.                     GPIOA->ODR = 0x7B;
  56.                     current = 0x09;
  57.                     break;
  58.     }
  59. }
  60.  
  61. void EXTI2_IRQHandler(void)
  62.     {
  63.         delay(DELAY_VAL);
  64.    
  65.         GPIOC->BSRR=GPIO_BSRR_BS12;
  66.         if(GPIOC->IDR & GPIO_IDR_IDR2 ){
  67.         setnumber(0x03);           
  68.        
  69.         }
  70.         GPIOC->BRR=GPIO_BRR_BR12;
  71.    
  72.         GPIOC->BSRR=GPIO_BSRR_BS11;
  73.         if(GPIOC->IDR  & GPIO_IDR_IDR2 ){
  74.         setnumber(0x06);
  75.    
  76.         }
  77.         GPIOC->BRR=GPIO_BRR_BR11;
  78.    
  79.         GPIOC->BSRR=GPIO_BSRR_BS10;
  80.         if(GPIOC->IDR & GPIO_IDR_IDR2  ){
  81.         setnumber(0x09);
  82.        
  83.     }
  84.         GPIOC->BRR=GPIO_BRR_BR10;
  85.    
  86.         GPIOC->BSRR=GPIO_BSRR_BS9;
  87.         if(GPIOC->IDR & GPIO_IDR_IDR2  ){
  88.         setnumber(0x00);
  89.        
  90.     }
  91.         GPIOC->BRR=GPIO_BRR_BR9;
  92.    
  93.         EXTI->PR|=EXTI_PR_PR2; //сбрасываем флаг прерывания
  94. }
  95.  
  96. void EXTI1_IRQHandler(void)
  97.     {
  98.         delay(DELAY_VAL);
  99.    
  100.         GPIOC->BSRR=GPIO_BSRR_BS12;
  101.         if(GPIOC->IDR & GPIO_IDR_IDR1 ){
  102.         setnumber(0x02);           
  103.        
  104.         }
  105.         GPIOC->BSRR=GPIO_BSRR_BR12;
  106.    
  107.         GPIOC->BSRR=GPIO_BSRR_BS11;
  108.         if(GPIOC->IDR  & GPIO_IDR_IDR1 ){
  109.         setnumber(0x05);
  110.        
  111.         }
  112.         GPIOC->BSRR=GPIO_BSRR_BR11;
  113.    
  114.         GPIOC->BSRR=GPIO_BSRR_BS10;
  115.         if(GPIOC->IDR & GPIO_IDR_IDR1  ){
  116.         setnumber(0x08);
  117.        
  118.     }
  119.         GPIOC->BSRR=GPIO_BSRR_BR10;
  120.    
  121.         GPIOC->BSRR=GPIO_BSRR_BS9;
  122.         if(GPIOC->IDR & GPIO_IDR_IDR1  ){
  123.         setnumber(0x00);
  124.        
  125.     }
  126.         GPIOC->BSRR=GPIO_BSRR_BR9;
  127.    
  128.         EXTI->PR|=EXTI_PR_PR1; //сбрасываем флаг прерывания
  129. }
  130.  
  131. void EXTI0_IRQHandler(void)
  132.     {
  133.         delay(DELAY_VAL);
  134.    
  135.         GPIOC->BSRR=GPIO_BSRR_BS12;
  136.         if(GPIOC->IDR & GPIO_IDR_IDR0 ){
  137.         setnumber(0x01);           
  138.        
  139.         }
  140.         GPIOC->BSRR=GPIO_BSRR_BR12;
  141.    
  142.         GPIOC->BSRR=GPIO_BSRR_BS11;
  143.         if(GPIOC->IDR  & GPIO_IDR_IDR0 ){
  144.         setnumber(0x04);
  145.        
  146.         }
  147.         GPIOC->BSRR=GPIO_BSRR_BR11;
  148.    
  149.         GPIOC->BSRR=GPIO_BSRR_BS10;
  150.         if(GPIOC->IDR & GPIO_IDR_IDR0  ){
  151.         setnumber(0x07);
  152.        
  153.     }
  154.         GPIOC->BSRR=GPIO_BSRR_BR10;
  155.    
  156.         GPIOC->BSRR=GPIO_BSRR_BS9;
  157.         if(GPIOC->IDR & GPIO_IDR_IDR0  ){
  158.         setnumber(0x00);
  159.        
  160.     }
  161.         GPIOC->BSRR=GPIO_BSRR_BR9;
  162.    
  163.         EXTI->PR|=EXTI_PR_PR0; //сбрасываем флаг прерывания
  164. }
  165. void TIM6_DAC_IRQHandler(void)
  166. {
  167.     TIM6->SR &= ~TIM_SR_UIF;            //Сброс флага переполнения
  168.    
  169.     if (seg == 1)   {               //Если светодиод LED2 включен,
  170.         seg = 0;   
  171.         GPIOA->ODR = 0x0;
  172.        
  173.     }
  174.     else{                           //Если нет -
  175.        
  176.         setnumber(current);//включаем!
  177.         seg = 1;
  178.         }
  179. }
  180.  
  181. void initButtons(void){
  182.    
  183.     RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN; //ТАКТИРУЕМ ПОРТ С И ПОДКЛЮЧАЕМ АЛЬТЕРНАТИВНЫЕ ФУНКЦИИ
  184.     GPIOC->CRL = 0;
  185.     // PC1
  186.      //зануляем режим работы выхода
  187.     GPIOC->CRL |= GPIO_CRL_CNF1_1; //устанавливаем в режим 1000(пул ап\пул довн)
  188.     GPIOC->BSRR|=GPIO_BSRR_BS1;    //выставляем ножку в 1
  189.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI1_PC;  // регистрация PC1 - вх. данные для прерывания
  190.     EXTI->FTSR |= EXTI_FTSR_TR1; //прерывание по спаду импульса
  191.     EXTI->IMR |= EXTI_IMR_MR1;   //активация прерывания по первой линии(PA1...PG1)
  192.     NVIC_EnableIRQ(EXTI1_IRQn);     // разрешаем прерывание
  193.     NVIC_SetPriority(EXTI1_IRQn, 0);// устанавливаем приоритет
  194.    
  195.    
  196.     //PC0
  197.     GPIOC->CRL |= GPIO_CRL_CNF0_1;
  198.     GPIOC->BSRR|=GPIO_BSRR_BS0;
  199.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PC;  
  200.     EXTI->FTSR |= EXTI_FTSR_TR0;
  201.     EXTI->IMR |= EXTI_IMR_MR0;
  202.     NVIC_EnableIRQ(EXTI0_IRQn);
  203.     NVIC_SetPriority(EXTI0_IRQn, 0);
  204.    
  205.     //PC2
  206.     GPIOC->CRL |= GPIO_CRL_CNF2_1;
  207.     GPIOC->BSRR|=GPIO_BSRR_BS2;
  208.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI2_PC;  
  209.     EXTI->FTSR |= EXTI_FTSR_TR2;
  210.     EXTI->IMR |= EXTI_IMR_MR2;
  211.     NVIC_EnableIRQ(EXTI2_IRQn);
  212.     NVIC_SetPriority(EXTI2_IRQn, 0);
  213.  
  214. }
  215.  
  216. void initOutputPorts(void)
  217. {  
  218.     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_AFIOEN;
  219.  
  220.    
  221.     GPIOA->CRL &= ~(GPIO_CRL_MODE | GPIO_CRL_CNF);
  222.     GPIOC->CRH &= ~(GPIO_CRH_MODE | GPIO_CRH_CNF);
  223.  
  224.    
  225.     GPIOC->CRH |= GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1;        //включаем режим 0011 на порте C на 12 11 10 9 ножке
  226.     GPIOC->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_MODE11_1;
  227.     GPIOC->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
  228.     GPIOC->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;
  229.     GPIOC->BSRR|=GPIO_BSRR_BR12;
  230.     GPIOC->BSRR|=GPIO_BSRR_BR11;
  231.     GPIOC->BSRR|=GPIO_BSRR_BR10;
  232.     GPIOC->BSRR|=GPIO_BSRR_BR9;
  233.    
  234.    
  235.     GPIOA->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1;      //включаем режим 0011
  236.     GPIOA->CRL |= GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1;
  237.     GPIOA->CRL |= GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1;
  238.     GPIOA->CRL |= GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1;
  239.     GPIOA->CRL |= GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1;
  240.     GPIOA->CRL |= GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1;
  241.     GPIOA->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1;
  242.  
  243. }
  244.  
  245.  
  246. void initTIM6(void)
  247. {
  248.     RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //Включить тактирование TIM6
  249.    
  250.     //Частота APB1 для таймеров = APB1Clk * 2 = 36МГц * 2 = 72МГц
  251.     TIM6->PSC = 12000-1;                //Предделитель частоты (72МГц/36000 = 2кГц)
  252.     TIM6->ARR = 2000-1;                 //Модуль счёта таймера (2кГц/2000 = 1с)
  253.     TIM6->DIER |= TIM_DIER_UIE;         //Разрешить прерывание по переполнению таймера
  254.     TIM6->CR1 |= TIM_CR1_CEN;           //Включить таймер
  255.    
  256.     NVIC_EnableIRQ(TIM6_DAC_IRQn);          //Рарзрешить прерывание от TIM6
  257.     NVIC_SetPriority(TIM6_DAC_IRQn, 1);     //Выставляем приоритет
  258. }
  259.  
  260.  
  261. int main(void)
  262. {
  263.     /*Инициализации */
  264.     initOutputPorts();
  265.     initTIM6();
  266.     initButtons();
  267.  
  268. while(1){
  269. }
  270.  
  271. }
  272. void delay(uint32_t takts)
  273. {
  274.     uint32_t i;
  275.    
  276.     for (i = 0; i < takts; i++) {};
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement