STM32实验程序代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1 GPIO
#include "stm32f10x.h"
#include "delay.h"
//#include "sys.h"
#include "stm32f10x_exti.h"
//QHKJ TEB-CM5000实验箱STM32实验1
//固件库V3.5工程模板
//QHKJ
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
/* Configure the system clocks */
// RCC_Configuration();
// SysTick_Configuration();
delay_init();
/* NVIC Configuration */
NVIC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
/* Connect EXTI Line9 to PA.9 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9);
/* Configure EXTI Line8 to generate an interrupt on falling edge */
EXTI_InitStructure.EXTI_Line = EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
for(;;)
{
GPIO_Write(GPIOF, 0xf80f);
delay_ms(100);
GPIO_Write(GPIOF, 0xf817);
delay_ms(100);
GPIO_Write(GPIOF, 0xf827);
delay_ms(100);
GPIO_Write(GPIOF, 0xf847);
delay_ms(100);
GPIO_Write(GPIOF, 0xf887);
delay_ms(100);
GPIO_Write(GPIOF, 0x8907);
delay_ms(100);
GPIO_Write(GPIOF, 0xfa07);
delay_ms(100);
GPIO_Write(GPIOF, 0xfc07);
delay_ms(100);
}
}
/******************************************************************************* * Function Name : NVIC_Configuration
* Description : Configures Vector Table base location.
* Input : None
* Output : None
* Return : None
*******************************************************************************/ void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the EXTI9_5 Interrupt */
// NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA, GPIOF and AFIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOF |
RCC_APB2Periph_AFIO, ENABLE);
/* Configure PF. as Output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pi n_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* Configure PA9 as input floating (EXTI Line9) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
实验7 LED流水灯
#include "stm32f10x.h"
//QHKJ TEB-CM5000实验箱STM32实验7
//固件库V3.5工程模板
//QHKJ
/*LED灯相关定义*/
#define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO时钟*/
#define LEDn 8 /*LED数量*/
#define GPIO_LED GPIOF /*LED灯使用的GPIO组*/
#define LD1_PIN GPIO_Pin_3 /*LD1使用的GPIO 管脚*/
#define LD2_PIN GPIO_Pin_4 /*LD2使用的GPIO管脚*/
#define LD3_PIN GPIO_Pin_5 /*LD3使用的GPIO管脚*/
#define LD4_PIN GPIO_Pin_6 /*LD4使用的GPIO管脚*/
#define LD5_PIN GPIO_Pin_7 /*LD5使用的GPIO 管脚*/
#define LD6_PIN GPIO_Pin_8 /*LD6使用的GPIO管脚*/
#define LD7_PIN GPIO_Pin_9 /*LD7使用的GPIO管脚*/
#define LD8_PIN GPIO_Pin_10 /*LD8使用的GPIO管脚*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure;
u8 count=0;
/* Private function prototypes -----------------------------------------------*/
//void RCC_Configuration(void);
//void NVIC_Configuration(void);
void Delay(vu32 nCount);
void Turn_On_LED(u8 LED_NUM);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
/* 配置LED灯使用的GPIO管脚模式*/
RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); /*使能LED灯使用的GPIO时钟*/
GPIO_InitStructure.GPIO_Pin = LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN|LD5_PIN|LD6_PIN|LD7_PIN|LD8_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_LED, &GPIO_InitStructure); /*使用的LED灯相关的GPIO口初始化*/
GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN|LD5_PIN|LD6_PIN|LD7_PI N|LD8_PIN);/*关闭所有的LED指示灯*/
while(1)
{
GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN|LD5_PIN|LD6_PIN|LD7_PI N|LD8_PIN);/*关闭所有的LED指示灯*/
Turn_On_LED(count%8); //点亮一个LED灯
count++;
Delay(0x0FFFFF);
}
}
/*点亮对应灯*/
void Turn_On_LED(u8 LED_NUM)
{
switch(LED_NUM)
{
case 0:
GPIO_SetBits(GPIO_LED,LD1_PIN); /*点亮LD1灯*/
break;
case 1:
GPIO_SetBits(GPIO_LED,LD2_PIN); /*点亮LD2灯*/
break;
case 2:
GPIO_SetBits(GPIO_LED,LD3_PIN); /*点亮LD3灯*/
break;
case 3:
GPIO_SetBits(GPIO_LED,LD4_PIN); /*点亮LD4灯*/
break;
case 4:
GPIO_SetBits(GPIO_LED,LD5_PIN); /*点亮LD5灯*/
break;
case 5:
GPIO_SetBits(GPIO_LED,LD6_PIN); /*点亮LD6灯*/
break;
case 6:
GPIO_SetBits(GPIO_LED,LD7_PIN); /*点亮LD7灯*/
break;
case 7:
GPIO_SetBits(GPIO_LED,LD8_PIN); /*点亮LD8灯*/
break;
default:
GPIO_SetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN|LD5_PIN|LD6_PIN|LD7_PIN|LD8_ PIN); /*点亮所有的灯*/
break;
}
}
/*******************************************************************************
* Function Name : Delay
* Description : Inserts a delay time.
* Input : nCount: specifies the delay time length.
* Output : None
* Return : None
*******************************************************************************/
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
实验11 串口收发
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
//QHKJ TEB-CM5000实验箱STM32实验11
//固件库V3.5工程模板
//QHKJ
/* Private typedef -----------------------------------------------------------*/
/*LED灯相关定义*/
#define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO时钟*/
#define LEDn 4 /*LED数量*/
#define GPIO_LED GPIOF /*LED灯使用的GPIO组*/
#define LD1_PIN GPIO_Pin_3 /*LD1使用的GPIO 管脚*/
#define LD2_PIN GPIO_Pin_4 /*LD2使用的GPIO管脚*/
#define LD3_PIN GPIO_Pin_5 /*LD3使用的GPIO管脚*/
#define LD4_PIN GPIO_Pin_6 /*LD4使用的GPIO管脚*/
/*串口相关定义*/
#define USART1_GPIO GPIOA
#define USART1_CLK RCC_APB2Periph_USART1
#define USART1_GPIO_CLK RCC_APB2Periph_GPIOA
#define USART1_RxPin GPIO_Pin_10
#define USART1_TxPin GPIO_Pin_9
//#define USART1_IRQn USART1_IRQn
//#define USART1_IRQHandler USART1_IRQHandler
#define USART2_GPIO GPIOA
#define USART2_CLK RCC_APB1Periph_USART2
#define USART2_GPIO_CLK RCC_APB2Periph_GPIOA
#define USART2_RxPin GPIO_Pin_3
#define USART2_TxPin GPIO_Pin_2
//#define USART2_IRQn USART2_IRQn
//#define USART2_IRQHandler USART2_IRQHandler
GPIO_InitTypeDef GPIO_InitStructure;
/* Private typedef -----------------------------------------------------------*/ typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/
#define TxBufferSize1 (countof(TxBuffer1) - 1)
#define TxBufferSize2 (countof(TxBuffer2) - 1)
#define RxBufferSize1 TxBufferSize2
#define RxBufferSize2 TxBufferSize1
/* Private macro -------------------------------------------------------------*/ #define countof(a) (sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/ USART_InitTypeDef USART_InitStructure;
u8 TxBuffer1[] = "串口中断收发示例: 串口1 -> 串口2 (中断收发)";
u8 TxBuffer2[] = "串口中断收发示例: 串口2 -> 串口1 (中断收发)";
u8 RxBuffer1[RxBufferSize1];
u8 RxBuffer2[RxBufferSize2];
u8 TxCounter1 = 0x00;
u8 TxCounter2 = 0x00;
u8 RxCounter1 = 0x00;
u8 RxCounter2 = 0x00;
u8 NbrOfDataToTransfer1 = TxBufferSize1;
u8 NbrOfDataToTransfer2 = TxBufferSize2;
u8 NbrOfDataToRead1 = RxBufferSize1;
u8 NbrOfDataToRead2 = RxBufferSize2;
u8 TransferStatus1 = FAILED;
u8 TransferStatus2 = FAILED;
/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program
* @param None
* @retval None
*/
int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有的LED指示灯*/ /* USART1 and USART2 configuration ------------------------------------------------------*/
/* USART1 and USART2 configured as follow:
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_ART_BaudRate = 115200; /*设置波特率为115200*/
USART_ART_WordLength = USART_WordLength_8b;/*设置数据位为8*/ USART_ART_StopBits = USART_StopBits_1; /*设置停止位为1位*/ USART_ART_Parity = USART_Parity_No; /*无奇偶校验*/
USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;/*无硬件流控*/
USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; /*发送和接收*/
/*配置串口1 */
USART_Init(USART1, &USART_InitStructure);
/*配置串口2*/
USART_Init(USART2, &USART_InitStructure);
/*使能串口1的发送和接收中断*/
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
/*使能串口2的发送和接收中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
/* 使能串口1 */
USART_Cmd(USART1, ENABLE);
/* 使能串口2 */
USART_Cmd(USART2, ENABLE);
/* Wait until end of transmission from USART1 to USART2 */
while(RxCounter2 < RxBufferSize2)
{
}
/* Wait until end of transmission from USART2 to USART1 */
while(RxCounter1 < RxBufferSize1)
{
}
/* Check the received data with the send ones */
TransferStatus1 = Buffercmp(TxBuffer2, RxBuffer1, RxBufferSize1);
/* TransferStatus1 = PASSED, if the data transmitted from USART2 and
received by USART1 are the same */
/* TransferStatus1 = FAILED, if the data transmitted from USART2 and
received by USART1 are different */
TransferStatus2 = Buffercmp(TxBuffer1, RxBuffer2, RxBufferSize2);
/* TransferStatus2 = PASSED, if the data transmitted from USART1 and
received by USART2 are the same */
/* TransferStatus2 = FAILED, if the data transmitted from USART1 and
received by USART2 are different */
while (1)
{
if(TransferStatus1 == PASSED)
{
GPIO_SetBits(GPIO_LED,LD1_PIN);/*点亮LD1,串口1接收的数据与串口2发送的数据相同*/
}
else if(TransferStatus1 == FAILED)
{
GPIO_SetBits(GPIO_LED,LD2_PIN);/*点亮LD2,串口1接收的数据与串口2发送的数据不相同*/
}
if(TransferStatus2 == PASSED)
{
GPIO_SetBits(GPIO_LED,LD3_PIN);/*点亮LD3,串口2接收的数据与串口1发送的数据相同*/
}
else if(TransferStatus2 == FAILED)
{
GPIO_SetBits(GPIO_LED,LD4_PIN);/*点亮LD4,串口2接收的数据与串口1发
送的数据不相同*/
}
}
}
/**
* @brief Configures the different system clocks.
* @param None
* @retval None
*/
void RCC_Configuration(void)
{
/*使能串口1和串口2使用的GPIO时钟*/
RCC_APB2PeriphClockCmd(USART1_GPIO_CLK |USART2_GPIO_CLK, ENABLE); /* Enable USART1 Clock */
/*使能串口1时钟*/
RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);
/*使能串口2时钟*/
RCC_APB1PeriphClockCmd(USART2_CLK, ENABLE);
/*使能LED灯使用的GPIO时钟*/
RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE);
}
/**
* @brief Configures the different GPIO ports.
* @param None
* @retval None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*串口1 RX管脚配置*/
/* Configure USART1 Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USART1_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
/*串口2 RX管脚配置*/
/* Configure USART2 Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USART2_RxPin;
GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
/*串口1 TX管脚配置*/
/* Configure USART1 Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USART1_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
/*串口2 TX管脚配置*/
/* Configure USART2 Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USART2_TxPin;
GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
/* 配置LED灯使用的GPIO管脚模式*/
GPIO_InitStructure.GPIO_Pin = LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_LED, &GPIO_InitStructure);
}
/**
* @brief Configures the nested vectored interrupt controller.
* @param None
* @retval None
*/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief Compares two buffers.
* @param pBuffer1, pBuffer2: buffers to be compared.
* @param BufferLength: buffer's length
* @retval PASSED: pBuffer1 identical to pBuffer2
* FAILED: pBuffer1 differs from pBuffer2
*/
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength) {
while(BufferLength--)
{
if(*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
/**
* @brief This function handles USART1 global interrupt request. * @param None
* @retval None
*/
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);
if(RxCounter1 == NbrOfDataToRead1)
{
/* Disable the USART1 Receive interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART1, TxBuffer1[TxCounter1++]);
if(TxCounter1 == NbrOfDataToTransfer1)
{
/* Disable the USART1 Transmit interrupt */
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}
/**
* @brief This function handles USART2 global interrupt request. * @param None
* @retval None
*/
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
RxBuffer2[RxCounter2++] = USART_ReceiveData(USART2);
if(RxCounter2 == NbrOfDataToRead1)
{
/* Disable the USART2 Receive interrupt */
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}
}
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART2, TxBuffer2[TxCounter2++]);
if(TxCounter2 == NbrOfDataToTransfer2)
{
/* Disable the USART2 Transmit interrupt */
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}。

相关文档
最新文档