(3) 配置串口USART1,实现通过串口向PC机的串口助手打印一个字符串。例如:interrupt 0。写出相应的
程序。(5分)
在KEIL C Target option -> target中选择 useMicroLIB void GPIO_Configuration(void) {
/* 定义 GPIO 初始化结构体 GPIO_InitStructure */ GPIO_InitTypeDef GPIO_InitStructure;
/* 设置USART1的Tx脚(PA.9)为第二功能推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 设置USART1的Rx脚(PA.10)为浮空输入脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); }
void USART_Configuration(void) {
USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600;
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; USART_Init(USART1 , &USART_InitStructure); USART_Cmd(USART1 , ENABLE); }
int fputc(int ch,FILE *f)
《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 6 页 共 12页
{ }
printf(\
(4) 写出整个外部中断以及串口输出的程序。(与第3小题相重合的部分程序不需要再写出)(10分)
#include \#include \
#include \#include \#include \
/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void); void Init_GPIOs (void); void Delay(uint32_t nTime); void USART_Configuration(void); void EXTI_Configuration(void); void NVIC_Configuration(void); int main(void) {
/* Configure Clocks for Application need */ RCC_Configuration();
NVIC_Configuration(); Init_GPIOs(); USART_Configuration(); { } }
void Init_GPIOs (void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(LD_GPIO_PORT_CLK|USERBUTTON_GPIO_CLK, ENABLE);
/* Configure User Button pin as input */ EXTI_Configuration(); while(1)
USART_SendData(USART1,(unsigned char)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); return ch;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;//USERBUTTON_GPIO_PIN 《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 7 页 共 12页
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_Init(USERBUTTON_GPIO_PORT, &GPIO_InitStructure); }
void EXTI_Configuration() {
EXTI_InitTypeDef EXTI_InitStructure;
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1 ;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
void NVIC_Configuration() {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* Enable and set EXTI0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void EXTI0_IRQHandler(void) { }
《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 8 页 共 12页
printf(\
EXTI_GenerateSWInterrupt(EXTI_Line1); EXTI_ClearFlag(EXTI_Line0);
void EXTI1_IRQHandler(void) { }
6.在基于ARM-Cortex M3内核的芯片上编写程序实现如下功能。定义一个32个整数的一维数组,配置DMA和CPU进行数据搬移,分别计算分别使用DMA和CPU来搬移这个数组所花的时间,并将这两个结果用串口传输到上位机显示。(20分) 1. 画出所需要的电路图。(5分)或者参见第五题去掉按键部分电路
printf(\EXTI_ClearFlag(EXTI_Line1);
2. 画出程序的流程图。(5分)
3. 写出DMA和CPU搬移数据的过程以及串口输出所花时间的程序。(10分) #include \#include \#include \
《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 9 页 共 12页
#define BufferSize 32 vu16 CurrDataCounter = 0; vu32 Tick = 0;
uc32 SRC_Const_Buffer[BufferSize ] = {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10, 0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20, 0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30, 0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40, 0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50, 0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60, 0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70, 0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80 };
u32 DST_Buffer[BufferSize ]; void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); void DMA_Configuration(void); void SysTick_Configuration(void); int main(void) {
u8 i = 0;
u8 TickCntCPU = 0; u8 TickCntDMA = 0;
RCC_Configuration(); /* 设置 NVIC */ NVIC_Configuration(); /* 设置 GPIO 端口 */ GPIO_Configuration(); /* 设置 USART */ USART_Configuration(); /* DMA初始化 */ DMA_Configuration(); /* SysTick初始化 */ SysTick_Configuration(); Tick = 0;
for(i = 0; i < BufferSize; i++) {
/* 在 RAM 中开辟一片空间用做DMA目的空间 */
/* 定义 DMA 传输数目变量 */
/* 计时变量 */
《嵌入式系统原理与应用 》课程试卷(A )参考答案及评分标准 第 10 页 共 12页