Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f10x.h"
- #include "stm32f10x_gpio.h"
- #include "stm32f10x_rcc.h"
- #include "stm32f10x_usart.h"
- #include "stm32f10x_adc.h"
- #include "stm32f10x_gpio.h"
- #include <stdio.h>
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- /***************************************************************************//**
- * @brief Init USART1
- ******************************************************************************/
- void SetupUSART() {
- /* Включаем тактирование USRAT1 и Порта A */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
- /* Настраиваем входы/выходы */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* Конфигурация USART1 */
- USART_InitStructure.USART_BaudRate = 115200; // Скорость порта
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; // Кол-во бит в пакете
- USART_InitStructure.USART_StopBits = USART_StopBits_1; // Кол-во Стоп-битов
- USART_InitStructure.USART_Parity = USART_Parity_No; // Чётность
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Управлением потоком
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // Включаем Tx и Rx линии
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1, ENABLE); // Данной командой, мы подтверждаем, что мы находимся во вменяемом состоянии
- // и разрешаем МК работать с USART1
- }
- void SetupADC() {
- // Пин A1 - это аналоговый вход.
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- //Частота блока АЦП = Частота ядра / этот показатель. 8MHz core / 8 = 1MHz
- RCC_ADCCLKConfig(RCC_PCLK2_Div8);
- // Включаем тактирование АЦП
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- // Конфигурация АЦП
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfChannel = 1; // Это канал АЦП. Если поставить 4, получим данные из PA4, и.т.п
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // Время оцифровки
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_Cmd(ADC1, ENABLE);
- // Выполняем калибровку АЦП
- ADC_ResetCalibration(ADC1);
- while (ADC_GetResetCalibrationStatus(ADC1))
- ;
- ADC_StartCalibration(ADC1);
- while (ADC_GetCalibrationStatus(ADC1))
- ;
- // Включаем АЦП
- ADC_Cmd(ADC1, ENABLE);
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Начинаем оцифровку (will be endless as we are in continuous mode)
- }
- void SetupLED() {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- int main(void) {
- SetupClock(); // Устанавливаем частоту ядра
- SetupUSART(); // Настраиваем USART1
- SetupADC(); // Настраиваем ADC на постоянное цикличное преобразование
- SetupLED(); // Порты для двух щтатных светодиодов
- int adc_value = 0; // тут хранится значение начение АЦП
- uint16_t usart_param = 0; // а это - команда, получаенная через USART
- while (1) {
- adc_value = ADC_GetConversionValue(ADC1); // Получаем значение АЦП
- long i = 0; // инициализация цикла постнадарту ISO C
- for (i = 0; i < 0xFFFFF; ++i) {
- asm("nop"); // Задержка. что бы небыло спама значения АЦП
- }
- printf("A %d\r\n", adc_value); // Отправляем данные. "<Команда> <Значение>"
- usart_param = USART_ReceiveData(USART1); // Зажигаем/гасим светодиод, в зависимоти от полученной команды
- switch (usart_param) {
- case 0x31: // ASCII: 1
- GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET); break;
- case 0x32: // ASCII: 2
- GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET); break;
- case 0x33: // ASCII: 3
- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); break;
- case 0x34: // ASCII: 4
- GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET); break;
- default:
- break;
- }
- usart_param = 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement