Advertisement
Guest User

Untitled

a guest
Jan 13th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 10.88 KB | None | 0 0
  1. #include "main.h"
  2.  
  3. unsigned int seg[] = {0x7E00, 0x3000, 0x6D00, 0x7900, 0x3300, 0x5B00, 0x5F00, 0x7000, 0x7F00, 0x7B00};
  4. char RxBuffer[RX_BUFF_SIZE];                    //буфер приема USART
  5. char TxBuffer[TX_BUFF_SIZE];                    //буффер передачи  USART
  6. bool ComReceived;                               //флаг приема строки
  7. uint16_t current = 0x7E00;
  8. uint16_t tseg = 1;
  9.  
  10. void USART2_IRQHandler(void)
  11. {
  12.     char tmp;
  13.     if ((USART2->SR & USART_SR_RXNE)!=0)        // узнаем что прерывание по приему байта
  14.     {
  15.         tmp=USART2->DR;
  16.         if (tmp==0x0D)                          //проверяем конец ли строки
  17.         {
  18.             ComReceived=true;                   //выставляем флаг приема строки
  19.             return;                            
  20.         }
  21.         RxBuffer[strlen(RxBuffer)] = tmp;       //ДОБАВЛЯЕМ В БУФФЕР если не конец строки
  22.     }
  23. }
  24.  
  25.  
  26. void initPorts(void)
  27. {
  28.    
  29.     //RCC->APB2ENR |= RCC_APB2ENR_IOPDEN;       //тактируем порт  D
  30.     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;     //тактируем порт A
  31.     RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;     //тактируем порт B
  32.    
  33.     // настраиваем семисегментник
  34.     GPIOB->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8);       
  35.     GPIOB->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
  36.     GPIOB->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10);
  37.     GPIOB->CRH &= ~(GPIO_CRH_MODE11 | GPIO_CRH_CNF11);
  38.     GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12);
  39.     GPIOB->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
  40.     GPIOB->CRH &= ~(GPIO_CRH_MODE14 | GPIO_CRH_CNF14);
  41.    
  42.     GPIOB->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1;      //0011 (настраиваем семисегментник
  43.     GPIOB->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;
  44.     GPIOB->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
  45.     GPIOB->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_MODE11_1;
  46.     GPIOB->CRH |= GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1;
  47.     GPIOB->CRH |= GPIO_CRH_MODE13_0 | GPIO_CRH_MODE13_1;
  48.     GPIOB->CRH |= GPIO_CRH_MODE14_0 | GPIO_CRH_MODE14_1;
  49.    
  50.  
  51.    
  52.    
  53. }
  54.  
  55. /**
  56.  
  57.   */
  58. void initUART2(void)
  59. {
  60.     /*UART2 Remapped - PD5-TX, PD6-RX   */
  61.     RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;         //включаем тактирование альтернативных функций
  62.     RCC->APB1ENR |= RCC_APB1ENR_USART2EN;       //включаем тактирование UART2
  63.    
  64.    
  65.    
  66.     GPIOA->CRL &= ~(GPIO_CRL_MODE2 | GPIO_CRL_CNF2);            //TX
  67.     GPIOA->CRL |= (GPIO_CRL_MODE2_1 | GPIO_CRL_CNF2_1);
  68.    
  69.     GPIOA->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3);        //RХ
  70.     GPIOA->CRL |= GPIO_CRL_CNF3_0
  71.    
  72.     /*****************************************
  73.  
  74.    
  75.     1. USARTDIV = 36000000/(16*115200) = 19.5
  76.     2. 19 = 0x13
  77.     3. 16*0.5 = 8
  78.     4.  0x138
  79.     *****************************************/
  80.     USART2->BRR = 0x4E2;
  81.    
  82.     USART2->CR2 = 0;
  83.     USART2->CR1 = 0;
  84.     USART2->CR1 |= USART_CR1_RE | USART_CR1_TE | USART_CR1_UE;
  85.     USART2->CR1 |= USART_CR1_RXNEIE;                //разрешаем прерывание по приему данных
  86.    
  87.     NVIC_EnableIRQ(USART2_IRQn);                    //разрешаем прерывание от USART2
  88.     NVIC_SetPriority(USART2_IRQn, 0);
  89. }
  90.  
  91.  
  92. void txStr(char *str)       //передача по USART2
  93. {
  94.     uint16_t i;
  95.         strcat(str,"\r");                              
  96.         strcat(str,"\n");           //добавляем символ конца строки
  97.    
  98.     for (i = 0; i < strlen(str); i++)
  99.     {
  100.         USART2->DR = str[i];                        //отправляем байт в регистр DR
  101.         while ((USART2->SR & USART_SR_TC)==0) {};   //ждем окончание передачи
  102.     }
  103. }
  104. void initOutputPorts(void)
  105. {  
  106.     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_AFIOEN;
  107.  
  108.    
  109.    
  110.     GPIOC->CRH &= ~(GPIO_CRH_MODE | GPIO_CRH_CNF);
  111.  
  112.    
  113.     GPIOC->CRH |= GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1;        //включаем режим 0011 на порте C на 12 11 10 9 ножке
  114.     GPIOC->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_MODE11_1;
  115.     GPIOC->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
  116.     GPIOC->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;
  117.     GPIOC->BSRR|=GPIO_BSRR_BR12;
  118.     GPIOC->BSRR|=GPIO_BSRR_BR11;
  119.     GPIOC->BSRR|=GPIO_BSRR_BR10;
  120.     GPIOC->BSRR|=GPIO_BSRR_BR9;
  121. }
  122.    
  123.  
  124. void setnumber(uint16_t i){
  125.    
  126.     switch(i){
  127.             case 0:
  128.                     GPIOB->ODR = 0x7E00;
  129.                     current = 0x7E00;
  130.                     break;
  131.             case 1:
  132.                     GPIOB->ODR = 0x3000;
  133.                     current = 0x3000;
  134.                     break;
  135.             case 2:
  136.                     GPIOB->ODR = 0x6D00;
  137.                     current = 0x6D00;
  138.                     break;
  139.             case 3:
  140.                     GPIOB->ODR = 0x7900;
  141.                     current = 0x7900;
  142.                     break;
  143.             case 4:
  144.                     GPIOB->ODR = 0x3300;
  145.                     current = 0x3300;
  146.                     break;
  147.             case 5:
  148.                     GPIOB->ODR = 0x5B00;
  149.                     current = 0x5B00;
  150.                     break;
  151.             case 6:
  152.                     GPIOB->ODR = 0x5F00;
  153.                     current = 0x5F00;
  154.                     break;
  155.             case 7:
  156.                     GPIOB->ODR = 0x7000;
  157.                     current = 0x7000;
  158.                     break;
  159.             case 8:
  160.                     GPIOB->ODR = 0x7F00;
  161.                     current = 0x7F00;
  162.                     break;
  163.             case 9:
  164.                     GPIOB->ODR = 0x7B00;
  165.                     current = 0x7B00;
  166.                     break;
  167.     }
  168. }
  169. void EXTI2_IRQHandler(void)
  170.     {
  171.         delay(DELAY_VAL);
  172.    
  173.         GPIOC->BSRR=GPIO_BSRR_BS12;
  174.         if(GPIOC->IDR & GPIO_IDR_IDR2 ){
  175.         setnumber(0x03);           
  176.        
  177.         }
  178.         GPIOC->BRR=GPIO_BRR_BR12;
  179.    
  180.         GPIOC->BSRR=GPIO_BSRR_BS11;
  181.         if(GPIOC->IDR  & GPIO_IDR_IDR2 ){
  182.         setnumber(0x06);
  183.    
  184.         }
  185.         GPIOC->BRR=GPIO_BRR_BR11;
  186.    
  187.         GPIOC->BSRR=GPIO_BSRR_BS10;
  188.         if(GPIOC->IDR & GPIO_IDR_IDR2  ){
  189.         setnumber(0x09);
  190.        
  191.     }
  192.         GPIOC->BRR=GPIO_BRR_BR10;
  193.    
  194.         GPIOC->BSRR=GPIO_BSRR_BS9;
  195.         if(GPIOC->IDR & GPIO_IDR_IDR2  ){
  196.         setnumber(0x00);
  197.        
  198.     }
  199.         GPIOC->BRR=GPIO_BRR_BR9;
  200.    
  201.         EXTI->PR|=EXTI_PR_PR2; //сбрасываем флаг прерывания
  202. }
  203.  
  204. void EXTI1_IRQHandler(void)
  205.     {
  206.         delay(DELAY_VAL);
  207.    
  208.         GPIOC->BSRR=GPIO_BSRR_BS12;
  209.         if(GPIOC->IDR & GPIO_IDR_IDR1 ){
  210.         setnumber(0x02);           
  211.        
  212.         }
  213.         GPIOC->BSRR=GPIO_BSRR_BR12;
  214.    
  215.         GPIOC->BSRR=GPIO_BSRR_BS11;
  216.         if(GPIOC->IDR  & GPIO_IDR_IDR1 ){
  217.         setnumber(0x05);
  218.        
  219.         }
  220.         GPIOC->BSRR=GPIO_BSRR_BR11;
  221.    
  222.         GPIOC->BSRR=GPIO_BSRR_BS10;
  223.         if(GPIOC->IDR & GPIO_IDR_IDR1  ){
  224.         setnumber(0x08);
  225.        
  226.     }
  227.         GPIOC->BSRR=GPIO_BSRR_BR10;
  228.    
  229.         GPIOC->BSRR=GPIO_BSRR_BS9;
  230.         if(GPIOC->IDR & GPIO_IDR_IDR1  ){
  231.         setnumber(0x00);
  232.        
  233.     }
  234.         GPIOC->BSRR=GPIO_BSRR_BR9;
  235.    
  236.         EXTI->PR|=EXTI_PR_PR1; //сбрасываем флаг прерывания
  237. }
  238.  
  239. void EXTI0_IRQHandler(void)
  240.     {
  241.         delay(DELAY_VAL);
  242.    
  243.         GPIOC->BSRR=GPIO_BSRR_BS12;
  244.         if(GPIOC->IDR & GPIO_IDR_IDR0 ){
  245.         setnumber(0x01);           
  246.        
  247.         }
  248.         GPIOC->BSRR=GPIO_BSRR_BR12;
  249.    
  250.         GPIOC->BSRR=GPIO_BSRR_BS11;
  251.         if(GPIOC->IDR  & GPIO_IDR_IDR0 ){
  252.         setnumber(0x04);
  253.        
  254.         }
  255.         GPIOC->BSRR=GPIO_BSRR_BR11;
  256.    
  257.         GPIOC->BSRR=GPIO_BSRR_BS10;
  258.         if(GPIOC->IDR & GPIO_IDR_IDR0  ){
  259.         setnumber(0x07);
  260.        
  261.     }
  262.         GPIOC->BSRR=GPIO_BSRR_BR10;
  263.    
  264.         GPIOC->BSRR=GPIO_BSRR_BS9;
  265.         if(GPIOC->IDR & GPIO_IDR_IDR0  ){
  266.         setnumber(0x00);
  267.        
  268.     }
  269.         GPIOC->BSRR=GPIO_BSRR_BR9;
  270.    
  271.         EXTI->PR|=EXTI_PR_PR0; //сбрасываем флаг прерывания
  272. }
  273. void initButtons(void){
  274.    
  275.     RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN; //ТАКТИРУЕМ ПОРТ С И ПОДКЛЮЧАЕМ АЛЬТЕРНАТИВНЫЕ ФУНКЦИИ
  276.     GPIOC->CRL = 0;
  277.     // PC1
  278.      //зануляем режим работы выхода
  279.     GPIOC->CRL |= GPIO_CRL_CNF1_1; //устанавливаем в режим 1000(пул ап\пул довн)
  280.     GPIOC->BSRR|=GPIO_BSRR_BS1;    //выставляем ножку в 1
  281.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI1_PC;  // регистрация PC1 - вх. данные для прерывания
  282.     EXTI->FTSR |= EXTI_FTSR_TR1; //прерывание по спаду импульса
  283.     EXTI->IMR |= EXTI_IMR_MR1;   //активация прерывания по первой линии(PA1...PG1)
  284.     NVIC_EnableIRQ(EXTI1_IRQn);     // разрешаем прерывание
  285.     NVIC_SetPriority(EXTI1_IRQn, 0);// устанавливаем приоритет
  286.    
  287.    
  288.     //PC0
  289.     GPIOC->CRL |= GPIO_CRL_CNF0_1;
  290.     GPIOC->BSRR|=GPIO_BSRR_BS0;
  291.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PC;  
  292.     EXTI->FTSR |= EXTI_FTSR_TR0;
  293.     EXTI->IMR |= EXTI_IMR_MR0;
  294.     NVIC_EnableIRQ(EXTI0_IRQn);
  295.     NVIC_SetPriority(EXTI0_IRQn, 0);
  296.    
  297.     //PC2
  298.     GPIOC->CRL |= GPIO_CRL_CNF2_1;
  299.     GPIOC->BSRR|=GPIO_BSRR_BS2;
  300.     AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI2_PC;  
  301.     EXTI->FTSR |= EXTI_FTSR_TR2;
  302.     EXTI->IMR |= EXTI_IMR_MR2;
  303.     NVIC_EnableIRQ(EXTI2_IRQn);
  304.     NVIC_SetPriority(EXTI2_IRQn, 0);
  305.  
  306. }
  307.  
  308.  
  309. void ExecuteCommand(void)
  310. {
  311.     txStr(TxBuffer);
  312.     memset(RxBuffer,0,RX_BUFF_SIZE);                //очищаем буффер
  313.     ComReceived = false;                            //сбрасываем флаг
  314. }
  315. void initTIM6(void)
  316. {
  317.     RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //Включить тактирование TIM6
  318.    
  319.     //Частота APB1 для таймеров = 24МГц
  320.     TIM6->PSC = 12000-1;                //Предделитель частоты (24МГц/12000 = 2кГц)
  321.     TIM6->ARR = 2000-1;                 //Модуль счёта таймера (2кГц/2000 = 1с)
  322.     TIM6->DIER |= TIM_DIER_UIE;         //Разрешить прерывание по переполнению таймера
  323.     TIM6->CR1 |= TIM_CR1_CEN;           //Включить таймер
  324.    
  325.     NVIC_EnableIRQ(TIM6_DAC_IRQn);          //Рарзрешить прерывание от TIM6
  326.     NVIC_SetPriority(TIM6_DAC_IRQn, 1);     //Выставляем приоритет
  327. }
  328.  
  329.  
  330. int main(void)
  331. {
  332.    
  333.     initPorts();
  334.     initUART2();
  335.     initTIM6();
  336.     initButtons();
  337.     initOutputPorts();
  338.        
  339.  
  340.     while(1)
  341.     {
  342.        
  343.         if (ComReceived)           
  344.         {
  345.             memset(TxBuffer,0,TX_BUFF_SIZE);
  346.             if(strcmp(RxBuffer, "*IDN?")==0)       
  347.             {
  348.                 strcpy(TxBuffer, "iu4-72 Yasinsky,Sokolov");
  349.                 ExecuteCommand();
  350.             }
  351.             else if(strcmp(RxBuffer, "0")==0)
  352.             {
  353.                     GPIOB->ODR = seg[0];   
  354.                     current = seg[0];
  355.             }
  356.             else if(strcmp(RxBuffer, "1")==0)
  357.             {
  358.                     GPIOB->ODR = seg[1];   
  359.                     current = seg[1];
  360.             }
  361.             else if(strcmp(RxBuffer, "2")==0)
  362.             {
  363.                     GPIOB->ODR = seg[2];   
  364.                     current = seg[2];
  365.             }
  366.             else if(strcmp(RxBuffer, "3")==0)
  367.             {
  368.                     GPIOB->ODR = seg[3];   
  369.                     current = seg[3];
  370.             }
  371.             else if(strcmp(RxBuffer, "4")==0)
  372.             {
  373.                     GPIOB->ODR = seg[4];   
  374.                     current = seg[4];
  375.             }
  376.             else if(strcmp(RxBuffer, "5")==0)
  377.             {
  378.                     GPIOB->ODR = seg[5];   
  379.                     current = seg[5];
  380.             }
  381.             else if(strcmp(RxBuffer, "6")==0)
  382.             {
  383.                     GPIOB->ODR = seg[6];   
  384.                     current = seg[6];
  385.             }
  386.             else if(strcmp(RxBuffer, "7")==0)
  387.             {
  388.                     GPIOB->ODR = seg[7];   
  389.                     current =seg[7];
  390.             }
  391.             else if(strcmp(RxBuffer, "8")==0)
  392.             {
  393.                     GPIOB->ODR = seg[8];   
  394.                     current = seg[8];
  395.             }
  396.             else if(strcmp(RxBuffer, "9")==0)
  397.             {
  398.                     GPIOB->ODR = seg[9];   
  399.                     current = seg[9];
  400.             }
  401.            
  402.             else
  403.             {
  404.                 strcpy(TxBuffer,"wrong");
  405.                 ExecuteCommand();
  406.             }
  407.             memset(RxBuffer,0,RX_BUFF_SIZE);
  408.             ComReceived = false;   
  409.         }  
  410.    
  411.     }
  412. }
  413.  
  414. /**
  415.  
  416.   */
  417. void delay(uint32_t takts)
  418. {
  419.     uint32_t i;
  420.    
  421.     for (i = 0; i < takts; i++) {};
  422. }
  423. void TIM6_DAC_IRQHandler(void)
  424. {
  425.     TIM6->SR &= ~TIM_SR_UIF;            //Сброс флага переполнения
  426.    
  427.     if (tseg == 1)  {               //Если светодиод LED2 включен,
  428.         tseg = 0;  
  429.         GPIOB->ODR = 0x0;
  430.        
  431.     }
  432.     else{                           //Если нет -
  433.        
  434.         GPIOB->ODR = current;//включаем!
  435.         tseg = 1;
  436.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement