IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-07-16 -> 正文阅读

[C++知识库]2021-07-16

(1)
1、建立一个流水灯工程

Next选择器件,再Finish。我的开发板上是Cyclone II系列EP2C8。

2、打开SOPC Builder,配置NIOS硬件

CPU配置经济型的就OK了

添加on-chip menory ROM 改名为progam,RAM改名为data

再添加PIO,4位OUTPUT改名为led,但这样Quartus II RUN时会产生错误

在错误上面点击右键help,上面提示:

> Project too complex: hierarchy path is too long

recursive logic迭代逻辑太多,为什么呢?其实很简单,因为PIO改名为led和工程名led一样,Quartus II无法辨别。所以以后大家注意这一点,工程名一定不要和SOPC PIO的名字相同。

这里我们就改名为led_pio,再进入CPU中,选择Reset Vector和Exception Vection分别为progam和data,

然后是地址分配和终端分配,先点击Auto-Assign Base Address,再点击Auto-Assign IRQs

最后Generate,等一会儿……

3、在Quartus II中建立原理图文件BDF,双击原理图的空白处,选择project里面我们建立SOPC例化图标:

点击OK,放置SOPC在BDF中,选中SOPC点击右键选择,会自动生成引脚,在更改你想要命名的引脚名即可。

这里我们命名为clk,reset和led[3…0] 。

4、锁定引脚,和FPGA的IO对应,建立TCL脚本文件,按自己FPGA开发板的实际情况,我的开发板TCl为

set_global_assignment -name RESERVE_ALL_UNUSED_PINS “AS INPUT TRI-STATED”

#未用的IO设为输入三态
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF
set_location_assignment PIN_23 -to clk
set_location_assignment PIN_56 -to reset

set_location_assignment PIN_6 -to led
0
0

set_location_assignment PIN_5 -to led
1
1

set_location_assignment PIN_3 -to led
2
2
set_location_assignment PIN_4 -to led
3
3
保存TCl文件后,选择Tools/Tcl Scriples

点击RUN,最后Start compilation

5、下载到FPGA中,点击progammer

到这里我们的硬件设计就OK了

6、打开NIOS II IDE软件,新建一个NIOS II C/C++ Application

Select Project Template: Blank Project

Name : led

SOPC Builder System PTF File选择我们建立的SOPC文件

NEXT,Finish……

7、在led上点击右键,NEW一个C语言文件

Source File输入C语言文件名,一定要加".c" ,Finish……

在NIOS 文件led上点击右键,选择System Library Properties

Program memory选择progam后OK!

8、下面我们在led.c里面写软件

#include “system.h”
#include “altera_avalon_pio_regs.h”

void delay(void)
{
unsigned int i;
i=100000;
while(i>0)
{
i–;
}
}

int alt_main(void)
{
unsigned char led_data;
unsigned int led_code;

while(1)
{
    for(led_data=0;led_data<4;led_data++)
    {
        led_code=0x01<<led_data;
        IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,~led_code);
        delay();
    }
}
return 0;

}

在NIOS工程led上面点击右键选择Build Project,稍等片刻……

同样在NIOS工程led点击右键Run AS–NIOS II Hardware,流水灯跑起来了

(2)
串口初始化
首先我们需要将USART初始化为普通的异步串口。

USART的初始化代码,在我们第一章里,已经由STM32CubeMX自动产生出来了,因为我们当时在配置引脚的时候将PA9/PA10配置成了UART1,自动产生出的UART初始化代码请参考main.c里面的:

MX_USART1_UART_Init函数:

/**

  • @brief USART1 Initialization Function
  • @param None
  • @retval None
    */
    static void MX_USART1_UART_Init(void)
    {

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

/* USER CODE BEGIN USART1_Init 1 */

/* USER CODE END USART1_Init 1 /
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/
USER CODE BEGIN USART1_Init 2 */

/* USER CODE END USART1_Init 2 */

}
以及stm32f1xx_hal_msp.c里面的函数MX_USART1_UART_Init:

/**

  • @brief USART1 Initialization Function
  • @param None
  • @retval None
    */
    static void MX_USART1_UART_Init(void)
    {

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

/* USER CODE BEGIN USART1_Init 1 */

/* USER CODE END USART1_Init 1 /
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/
USER CODE BEGIN USART1_Init 2 */

/* USER CODE END USART1_Init 2 */

}
其中:MX_USART1_UART_Init是在HAL_UART_Init里面调用的。

然后我们稍微封装一下串口的输出接口:

void uart1_write(void* pdata, unsigned int len)
{
HAL_UART_Transmit(&huart1, pdata, len, HAL_MAX_DELAY);
}

void uart1_write_byte(uint8_t value)
{
uart1_write(&value, 1);
}
重定向C库的printf函数到串口
gcc编译器的small库需要重新实现__io_putchar即可。

而非gcc编译器,如ARMCC编译器则需要重新实现fputc。

#ifdef GNUC
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to ‘Yes’) calls __io_putchar() /
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE f)
#endif /
GNUC /
/

  • @brief Retargets the C library printf function to the USART.
  • @param None
  • @retval None
    */
    PUTCHAR_PROTOTYPE
    {
    uart1_write_byte((uint8_t)ch);
    return ch;
    }
    所以上面这段代码可以同时用于gcc或非gcc编译器。

在main中添加测试代码
在串口初始化后的任意地方加入Hello nios-II输出语句:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:43:20  更:2021-07-17 11:44:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 18:01:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码