Advertisement
Ursadon

Focade - stm32

Oct 25th, 2011
1,211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.22 KB | None | 0 0
  1. #include "stm32f10x.h"
  2. #include "stm32f10x_gpio.h"
  3. #include "stm32f10x_rcc.h"
  4. #include "stm32f10x_usart.h"
  5. #include "stm32f10x_adc.h"
  6. #include "stm32f10x_gpio.h"
  7. #include <stdio.h>
  8.  
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. ADC_InitTypeDef ADC_InitStructure;
  11. USART_InitTypeDef USART_InitStructure;
  12.  
  13. /***************************************************************************//**
  14.  * @brief Init USART1
  15.  ******************************************************************************/
  16. void SetupUSART() {
  17.     /* Включаем тактирование USRAT1 и Порта A                               */
  18.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  19.  
  20.     /* Настраиваем входы/выходы                                             */
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  23.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  24.  
  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  28.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  29.  
  30.     /* Конфигурация USART1 */
  31.     USART_InitStructure.USART_BaudRate = 115200; // Скорость порта
  32.     USART_InitStructure.USART_WordLength = USART_WordLength_8b; // Кол-во бит в пакете
  33.     USART_InitStructure.USART_StopBits = USART_StopBits_1; // Кол-во Стоп-битов
  34.     USART_InitStructure.USART_Parity = USART_Parity_No; // Чётность
  35.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Управлением потоком
  36.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // Включаем Tx и Rx линии
  37.     USART_Init(USART1, &USART_InitStructure);
  38.     USART_Cmd(USART1, ENABLE); // Данной командой, мы подтверждаем, что мы находимся во вменяемом состоянии
  39.                                // и разрешаем МК работать с USART1
  40. }
  41.  
  42. void SetupADC() {
  43. // Пин A1 - это аналоговый вход.
  44. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  45. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  46. GPIO_Init(GPIOA, &GPIO_InitStructure);
  47.  
  48. //Частота блока АЦП = Частота ядра / этот показатель. 8MHz core / 8 = 1MHz
  49. RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  50. // Включаем тактирование АЦП
  51. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  52.  
  53. // Конфигурация АЦП
  54. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  55. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  56. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  57. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  58. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  59. ADC_InitStructure.ADC_NbrOfChannel = 1; // Это канал АЦП. Если поставить 4, получим данные из PA4, и.т.п
  60.  
  61. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // Время оцифровки
  62. ADC_Init(ADC1, &ADC_InitStructure);
  63.  
  64. ADC_Cmd(ADC1, ENABLE);
  65.  
  66. // Выполняем калибровку АЦП
  67. ADC_ResetCalibration(ADC1);
  68. while (ADC_GetResetCalibrationStatus(ADC1))
  69.     ;
  70. ADC_StartCalibration(ADC1);
  71. while (ADC_GetCalibrationStatus(ADC1))
  72.     ;
  73.  
  74. // Включаем АЦП
  75. ADC_Cmd(ADC1, ENABLE);
  76. ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Начинаем оцифровку (will be endless as we are in continuous mode)
  77.  
  78. }
  79.  
  80. void SetupLED() {
  81.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  82.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  83.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  84.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  85.     GPIO_Init(GPIOC, &GPIO_InitStructure);
  86. }
  87.  
  88. int main(void) {
  89.     SetupClock(); // Устанавливаем частоту ядра
  90.     SetupUSART(); // Настраиваем USART1
  91.     SetupADC(); // Настраиваем ADC на постоянное цикличное преобразование
  92.     SetupLED(); // Порты для двух щтатных светодиодов
  93.  
  94.    
  95.     int adc_value = 0; // тут хранится значение начение АЦП
  96.     uint16_t usart_param = 0; // а это - команда, получаенная через USART
  97.     while (1) {
  98.         adc_value = ADC_GetConversionValue(ADC1); // Получаем значение АЦП
  99.         long i = 0; // инициализация цикла постнадарту ISO C
  100.         for (i = 0; i < 0xFFFFF; ++i) {
  101.             asm("nop"); // Задержка. что бы небыло спама значения АЦП
  102.         }
  103.         printf("A %d\r\n", adc_value); // Отправляем данные. "<Команда> <Значение>"
  104.         usart_param = USART_ReceiveData(USART1); // Зажигаем/гасим светодиод, в зависимоти от полученной команды
  105.         switch (usart_param) {
  106.         case 0x31: // ASCII: 1
  107.             GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET); break;
  108.         case 0x32: // ASCII: 2
  109.             GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET); break;
  110.         case 0x33: // ASCII: 3
  111.             GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); break;
  112.         case 0x34: // ASCII: 4
  113.             GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET); break;
  114.         default:
  115.             break;
  116.         }
  117.         usart_param = 0;
  118.     }
  119. }
  120.  
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement